水平扩展和 cron 作业

7 distributed-computing horizontal-scaling symfony amazon-elastic-beanstalk

我最近被迫将我的应用程序转移到亚马逊并使用自动缩放,我偶然发现了 cron 作业和自动缩放的问题。

我有一个每 15 分钟运行一次的 cron 作业,它检查订阅是否应该收费,查询选择所有过期的订阅,并尝试对它们收费。它一旦处理就会改变它们的状态,但是它们是批量获取的,并且该过程需要 1-3 分钟。

如果我有多个具有相同 cron 作业的实例,它可能会同时触发并对订阅进行多次收费。这种事其实已经发生过一次了。

这里最好的方法是什么?以某种方式锁定桌子?

我正在使用 Amazon elastic beanstalk 和 symfony3。

E.K*_*.K. 0

至少您可以使用专用的微型实例进行订阅收费(当然不是自动缩放),只需使用 cron 作业即可。最简单但最安全的方法(显然,如果您将订阅处理逻辑从可能被黑客攻击的前端服务器移至无法从全球网络访问的 VPC 子网后面的服务器,这将是安全的)。

但如果您不愿意,您仍然可以使用另一种方法。你提到你使用Beanstalk. Beanstalk允许使用延迟作业。

所以可能的做法是:

1)当你创建订阅时,你可以计算出什么时候应该收费,然后将计算出延迟的作业推送到Beanstalktube。

2)然后,工人准时得到工作(订阅)。只有一名工作人员将获得特定的工作,因此如果您使用自动缩放,它将起作用。

3)在worker中,您检查订阅(可能会被删除或处于非活动状态等),如果它准备好充电,只需运行充电代码即可。然后计算下一个充电时间并将新的延迟作业(带有订阅)推送到队列中。

BeanstalkSymfony 包强大的 PHP 库