![](/img/trans.png)
[英]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.