目前,我有一个应用程序运行在一个服务器上。有一个crontab设置,因此根据指定的规则,在特定的时间运行任务。
现在,我正在考虑将我的应用程序迁移到docker容器中,以便能够独立运行我的应用程序的多个实例。我想知道的是如何做,如何安排跨多个码头容器的任务,。
假设我有一个php命令,它每小时通过API从第三方应用程序中获取新数据。目前,我会使用cron来调度它:0 */1 * * * php /some/path/index.php mycommand。可以有多个类似的命令在不同的频率发射。
我不能简单地将crontab打包到我的docker映像中,因为当有5个容器运行时,命令将被启动5次。我只想在运行容器计数的情况下独立启动一次。
实现这一目标的理想解决方案是什么?
发布于 2017-04-07 15:17:00
您可以使用锁定机制,使用类似redis之类的工具。基本上是这样的。
脚本醒了,它做的第一件事,就是试着获得锁。如果它得到了锁,那么它向前移动,如果其他东西有锁,那么退出。执行脚本所做的操作,然后释放锁。
因为一次只有一个脚本可以获得锁,所以它只允许脚本运行一次。
重要的是,在脚本完成时删除锁,并向锁中添加一个TTL,以便如果脚本在释放锁之前死亡,则锁将在TTL过期后自动打开。
下面是一些关于如何使用Redis作为分布式锁的文档。https://redis.io/topics/distlock
发布于 2017-04-09 16:25:43
在您的情况下,一个简单的策略是使用具有不同角色的容器。例如,与使用响应HTTP请求的5个容器和运行cron不同,您可以让4个容器只运行您的应用程序,一个只运行cron作业。
如果您需要扩展您的cron作业以添加更多节点,那么您将需要一个分布式队列/锁解决方案,正如@Ken所描述的那样。
https://stackoverflow.com/questions/43281216
复制相似问题