簡體   English   中英

即使有 5 個實例,也僅在 1 個 EC2 上運行操作

[英]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)。

當計划的操作運行時,請執行以下操作:

  1. GetItem讀取我們上面剛剛討論的掃描計划項的當前值
  2. 如果lastScanTimestamp早於 25 秒,嘗試使用此主機的信息更新項目並將lastScanTimestamp設置為當前時間戳,同時增加version屬性,使用條件表達式檢查version == 與之前的值相同在第 1 步閱讀
  3. 如果條件更新成功,則可以開始掃描操作; 但是,如果條件更新失敗,則意味着另一台主機先到了它,並且該主機不應繼續掃描

請注意,上述算法的關鍵是條件表達式,它允許您設置讀取-修改-寫入序列的條件,以便您可以檢測到自從您讀取狀態並嘗試更改項目后是否有其他人碰巧更改了項目。更新它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM