什么';跨docker集群调度任务的最佳方法是什么?

什么';跨docker集群调度任务的最佳方法是什么?,docker,cron,containers,scheduler,Docker,Cron,Containers,Scheduler,目前,我有一个应用程序在一台服务器上运行。有一个crontab设置,因此根据指定的规则,在特定的时间运行任务 现在,我正在考虑将我的应用程序迁移到docker容器中,以便能够独立运行我的应用程序的多个实例。我想知道的是如何跨多个docker容器调度任务 假设我有一个php命令,每小时通过API从第三方应用程序获取新数据。目前,我将使用cron如下安排它:0*/1***php/some/path/index.php mycommand。可以以不同频率发出多个类似命令 我不能简单地将crontab打

目前,我有一个应用程序在一台服务器上运行。有一个crontab设置,因此根据指定的规则,在特定的时间运行任务

现在,我正在考虑将我的应用程序迁移到docker容器中,以便能够独立运行我的应用程序的多个实例。我想知道的是如何跨多个docker容器调度任务

假设我有一个php命令,每小时通过API从第三方应用程序获取新数据。目前,我将使用cron如下安排它:
0*/1***php/some/path/index.php mycommand
。可以以不同频率发出多个类似命令

我不能简单地将crontab打包到docker映像中,因为当有5个容器运行时,该命令将启动5次。我只想在运行容器计数时单独启动它一次


实现这一点的理想解决方案是什么?

您可以使用锁定机制,使用redis之类的工具。基本上是这样的

脚本醒来时,它做的第一件事就是尝试获取锁。如果它得到锁,那么它向前移动,如果其他东西有锁,那么退出。执行脚本所做的操作,然后释放锁

由于一次只能有一个脚本获得锁,因此它只允许脚本运行一次

在脚本完成时移除锁非常重要,并且还要向锁添加一个TTL,这样,如果脚本在释放锁之前死亡,锁将在TTL过期后自动打开


下面是一些关于如何使用Redis作为分布式锁的文档

在您的案例中,一个简单的策略是使用具有不同角色的容器。例如,与使用5个容器响应HTTP请求并运行cron不同,您可以使用4个容器仅运行应用程序,一个容器专门用于cron作业


如果您需要扩展cron作业以添加更多节点,那么您将需要一个分布式队列/锁解决方案,如@Ken Cochrane所述。

我认为Consor将是此方案的理想人选。感谢您提供此解决方案,特别是建议如何使用Redis准确实现此解决方案@f-society为什么您认为领事是理想的?谢谢您的解决方案。由于这看起来非常可行,我将接受Ken的解决方案,因为正如您所说,它是可扩展的,可能需要不太复杂的部署设置。但肯定要投票支持!