目前,我在一台服务器上运行了一个应用程序。根据指定的规则设置了crontab,在某些时间运行任务。
现在,我正考虑将我的应用迁移到docker容器中,以便我能够独立运行我的应用的多个实例。我想知道该怎么做的是如何在多个泊坞容器中安排任务。
让我们说我有一个php命令,每小时通过API从第三方应用程序获取新数据。目前,我会使用cron来安排它:0 */1 * * * php /some/path/index.php mycommand
。可以在不同的频率上发起多个类似的命令。
我不能简单地将crontab打包到我的docker镜像中,因为当有5个容器运行时,命令将被启动5次。我想在运行容器计数时独立启动它一次。
实现这一目标的理想解决方案是什么?
答案 0 :(得分:3)
您可以使用锁定机制,使用像redis这样的东西。基本上它会像这样工作。
脚本醒来,首先它是,尝试获取锁定。如果它获得锁定,那么它向前移动,如果其他东西有锁定,则退出。执行脚本执行的操作,然后释放锁定。
由于一次只能有一个脚本获取锁,因此只允许脚本运行一次。
在脚本完成时删除锁定很重要,并且还要向锁定添加TTL,这样如果脚本在释放锁定之前死亡,则锁定将在TTL到期后自动打开。
以下是一些有关如何将Redis用作分布式锁的文档。 https://redis.io/topics/distlock
答案 1 :(得分:1)
您的案例中的一个简单策略是使用具有不同角色的容器。例如,不是使用响应HTTP请求和运行cron的5个容器,而是只有4个容器运行应用程序,而另一个容器专门用于cron作业。
如果您需要扩展您的cron作业以添加更多节点,那么您需要一个分布式队列/锁定解决方案,如@Ken Cochrane所述。