[英]Do Java scheduled tasks run on all EC2 instances of AWS auto scaling group?
[英]Run an operation only on 1 EC2 even if there are 5 instances
用例:
我必須在 30 秒內定期掃描 DynamoDB 表。 我有五個 EC2 實例在一個隊列上運行,但我希望在 30 秒間隔結束時,五個 EC2 實例中只有一個應該在 DynamoDB 中執行掃描,而不是全部。
如果一個操作即將啟動,我該如何實現這種機制,只有 1 個 EC2 實例應該選擇該操作而不是全部。
為了實現您的目標,您必須制定一個策略,讓您的 EC2 主機同意由哪個主機進行掃描。
有多種可能的解決方案,但一個可能相當容易實現的解決方案是在 DynamoDB 中使用樂觀並發到 select EC2 主機進行每次掃描。
在同一個表中(如果架構允許)或在單獨的表中創建具有以下屬性的掃描計划項:
key
- 一個主鍵(如果您需要將 retrofit 放入現有表模式,也可以是復合鍵)設置為一些 static 值,您可以使用它來獲取和放置項目host
- 一個字符串屬性,將更新以反映正在執行掃描的主機的名稱,每次掃描成功啟動lastScanTime
- 一個數字屬性,每次掃描成功啟動時,都會更新為上次掃描開始時的紀元時間戳version
- 一個數字屬性,將用作單調遞增的數值,以實現樂觀並發(更多內容見下文)現在,在每個 EC2 主機上,設置每 30 秒運行一次的操作(可以是設置為每 30 秒運行一次的本地 cron)。
當計划的操作運行時,請執行以下操作:
lastScanTimestamp
早於 25 秒,嘗試使用此主機的信息更新項目並將lastScanTimestamp
設置為當前時間戳,同時增加version
屬性,使用條件表達式檢查version
== 與之前的值相同在第 1 步閱讀請注意,上述算法的關鍵是條件表達式,它允許您設置讀取-修改-寫入序列的條件,以便您可以檢測到自從您讀取狀態並嘗試更改項目后是否有其他人碰巧更改了項目。更新它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.