【发布时间】:2018-05-23 06:31:53
【问题描述】:
我有一个由 5 个容器组成的集群运行同一个应用程序。
此应用需要执行计划的重复任务(每 10 分钟一次)。
但是这个任务只需要在集群的一个容器中执行,而不是在全部 5 个容器中执行。
我怎样才能做到这一点?
我要做的是每 10 分钟查询一次数据库表以查找新记录并将它们发布到 RabbitMQ 服务器,然后删除此数据库记录。因此,消息通过同一应用程序的所有 5 个容器分发以进行处理。
我不能在所有容器中同时执行相同的调度任务,因为所有 5 个容器都会从数据库中查询相同的记录并复制 RabbitMQ 中的消息。
另外,我不想执行数据库锁定,以便一次只允许一个容器查询数据库,因为这不是很好的扩展性以及其他问题。
【问题讨论】:
-
您可以从您的常规应用程序中删除调度任务植入,并创建新的应用程序只执行调度任务。将调度应用程序移出主应用程序后,您应该能够将它们作为容器运行。
-
@NaveenKumar 但如果我创建一个新应用程序以在主应用程序外部执行调度任务并在单个容器中运行它,我将失去容错能力。如果这个单一容器死亡,主集群应用将永远不会收到新消息。
-
鉴于调度操作的范围,我相信“调度作业容器”不需要永远运行。您应该能够每 10 分钟旋转一次容器并完成这项工作。我相信容器编排框架应该能够以周期性的方式启动容器。一旦数据库操作完成,容器就会死亡。你的感受和想法?
-
@NaveenKumar 同意,调度作业容器不需要永远运行。并且在未来我计划使用 Kubernetes 和一个单独的容器将更容易启动/停止,主应用程序的副本等。感谢您的洞察力!
标签: docker concurrency timertask