如何在没有像 Quartz Clustering 这样的集中式解决方案的情况下在分布式环境中实现 cron 作业/计划作业? [复制]

Posted

技术标签:

【中文标题】如何在没有像 Quartz Clustering 这样的集中式解决方案的情况下在分布式环境中实现 cron 作业/计划作业? [复制]【英文标题】:How can I implement cron jobs/scheduled jobs in a distributed environment without centralized solution like Quartz Clustering? [duplicate] 【发布时间】:2020-12-29 22:11:40 【问题描述】:

我想在单个 Spring 工件中实现 cron 作业/计划作业以及我的 Web 服务。由于工件部署在分布式环境中,计划的作业可能会多次使用相同的数据/作业,这是我尽量避免的。

常见的解决方案似乎是使用像 Quartz Clustering 这样的集中式集群,它涉及一个额外的数据库来存储作业的状态。但是我暂时不想在我的系统架构中引入太多的复杂性,还有其他更好的解决方案吗?

【问题讨论】:

可能是共享缓存。 也许下面的链接可以帮到你:***.com/questions/62492285/… 【参考方案1】:

基本上,您需要为每个要执行的作业选择一台服务器。

每个作业都使用同一台服务器是否可以接受?

如果那台服务器处于非活动状态,需要发生什么?如何判断它是否处于非活动状态?

如果你有一个共享缓存(例如 Hazelcast)或一个共享数据库(SQL 或 NoSQL),你可以创建一个锁表并做一些聪明的事情,如果不存在每个服务器的 ip 有条件地插入一条记录,看看谁赢了. You can use the same table as a heart beat by adding a timestamp field and updating it every X seconds from the elected master.如果其他服务器继续读取它,它们可以在 X+Y 秒后检测到 master 已死,另一个可以接管。

还有 Zookeeper,如果您想将它添加到您的堆栈中。 Curator 框架有一个 LeaderElection 的配方:https://curator.apache.org/curator-recipes/leader-election.html

过去我也看到使用 JGroups:https://www.javacodegeeks.com/2016/06/jgroups-leader-election-without-additional-infrastructure.html 但这依赖于 IP 广播或多播,因此这可能不适用于您的网络拓扑。

【讨论】:

以上是关于如何在没有像 Quartz Clustering 这样的集中式解决方案的情况下在分布式环境中实现 cron 作业/计划作业? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Quartz.Net 如何创建每天不增加 1 分钟的日程安排

Quartz定时任务

iPhone开发中如何制作这种动画效果? Quartz 2d,Vore 动画?

ml.clustering.LocalLDAModel 中没有 topicDistributions(..) 方法

Android Google Maps in Fragment Clustering Bug

.NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介