我有一个jvm进程每X分钟唤醒一个线程 如果条件为真 - >它开始了一份工作(JobA)。
另一个jvm进程几乎完全相同但如果条件为真 -
它向消息代理抛出一条消息,该消息代理在另一台服务器(JobB)中触发该作业。
现在,为了避免SPOF问题,我想在我的云中添加这台机器的另一个实例 但是我想要确保每次都运行JobA的单个实例。
我有什么选择?
答案 0 :(得分:1)
有许多模式可以解决这个常见问题。您需要根据您的具体情况进行选择,具体取决于您的情况中哪个因素具有更大的权重(性能,正确性,容错性,允许或不允许失火等)。两个解决方案组是:
" Quartz"方式:您可以使用Quartz库中的JDBCStore(部分)是出于这个原因而设计的。它允许多个节点进行通信,并在彼此之间共享状态和工作负载。这个解决方案为您提供了一个可能完美的解决方案,代价是一些额外的编码并在节点之间设置共享数据库(我认为有9个表)。
或者,您的节点可以处理分发本身:锁定资源(例如,DB中的单个记录)足以决定谁负责执行的迭代。然而,分享以前的状态需要更多的工作。