【问题标题】:Java - How can I ensure I run a single instance of a process in a clustered environmentJava - 如何确保在集群环境中运行单个进程实例
【发布时间】:2016-02-10 16:13:48
【问题描述】:

我有一个 jvm 进程,它每 X 分钟唤醒一个线程。
如果条件为真 -> 它将启动一项工作 (JobA)。

另一个 jvm 进程几乎相同,但如果条件为真 -
它向消息代理抛出一条消息,该消息代理触发另一台服务器(JobB)中的作业。

现在,为了避免 SPOF 问题,我想在我的云中添加这台机器的另一个实例。
但我想确保我每次都运行一个 JobA 实例。

我有什么选择?

【问题讨论】:

  • 您考虑过任何特定的并发锁定机制吗?
  • 不,这就是我来这里的目的。

标签: java cron quartz-scheduler mutual-exclusion


【解决方案1】:

有许多模式可以解决这个常见问题。您需要根据您的具体情况以及在您的情况下哪个因素更重要(性能、正确性、容错性、是否允许失火等)进行选择。两个解决方案组是:

  • “Quartz”方式:您可以使用 Quartz 库中的 JDBCStore,该库(部分)正是为此而设计的。它允许多个节点进行通信,并在彼此之间共享状态和工作负载。此解决方案为您提供了一个可能完美的解决方案,但代价是一些额外的编码和在节点之间设置共享数据库(我认为是 9 个表)。

  • 或者,您的节点可以自行处理分配:锁定资源(例如,数据库中的单个记录)足以决定谁负责该执行迭代。然而,共享以前的状态需要更多的工作。

【讨论】:

  • 我用的是nosql,所以Jdbc不是我的方式。我目前正在锁定一个文档,但我认为可能还有其他建议(可能是框架建议)。
  • @rails JobStores 存在于某些 nosql 类型中,例如 redis-quartz 或quartz-mongodb。你用什么?
猜你喜欢
  • 2010-11-14
  • 2018-02-18
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
相关资源
最近更新 更多