首页 文章

跨Docker集群安排任务的最佳方法是什么?

提问于
浏览
3

目前,我在一台服务器上运行了一个应用程序 . 根据指定的规则设置了crontab,在某些时间运行任务 .

现在,我'm thinking about migrating my app into docker container so I'能够独立运行我的应用程序的多个实例 . 我想知道该怎么做是 How to schedule tasks across multiple docker containers .

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

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

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

2 回答

  • 1

    您可以使用锁定机制,使用像redis这样的东西 . 基本上它会像这样工作 .

    脚本醒来,首先它是,尝试获得锁定 . 如果它获得锁定,那么它向前移动,如果其他东西有锁定,则退出 . 执行脚本执行的操作,然后释放锁定 .

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

    在脚本完成时删除锁定很重要,并且还要向锁定添加TTL,这样如果脚本在释放锁定之前死亡,则锁定将在TTL到期后自动打开 .

    以下是一些有关如何将Redis用作分布式锁的文档 . https://redis.io/topics/distlock

  • 3

    在您的情况下,一个简单的策略是使用具有不同角色的容器 . 例如,不是使用响应HTTP请求和运行cron的5个容器,而是只有4个容器运行应用程序,而一个容器专门用于cron作业 .

    如果你需要扩展你的cron作业添加更多的节点,那么你需要一个像@Ken Cochrane所描述的分布式队列/锁定解决方案 .

相关问题