在并行处理中进行故障转移的 Hazelcast 最佳实践

Hazelcast best practices to failover in parallel processing

我是 Hazelcast 的新手。所以有一个关于并行处理期间最佳故障处理实践的问题:

掌握 Hazelcast,第 6.6 节,p. 96:

Work-queue has no high availability: Each member will create one or more local ThreadPoolExecutors with ordinary work-queues that do the real work. When a task is submitted, it will be put on the work-queue of that ThreadPoolExecutor and will not be backed up by Hazelcast. If something would happen with that member, all unprocessed work will be lost.

任务:

假设我有 1 个主节点和 2 个从节点。我用

启动耗时的任务
executor.submitToAllMembers (new TimeConsumingTask())

所以每个节点都在处理一些东西。当他们都在处理某事时,其中一个奴隶失败了

问题:

  1. 不可能在另一个节点上重新运行失败的成员工作,对吗?
  2. 除了在整个集群中重新运行整个作业集之外,还有其他(最好是更好的)方法吗?(如果 TimeConsumingTaskRunnable )
  3. 除了在整个集群中重新运行整个作业集之外,还有其他(最好是更好的)方法吗?(如果 TimeConsumingTaskCallable我想得到一个 Future 作为集群计算结果)

我假设 'failure handling' 你说的是集群中的一个节点出现故障的场景....

问题 1 不是自动的。您假设 Hazelcast 的执行任务不是容错的是正确的。但是,如果您能够处理任务失败,我看不出您不能将工作重新提交给集群中的另一个成员的原因。

问题 2 很难知道您的 TimeConsumingTask 实际在做什么 - 与任何分布式执行引擎一样,通常最好将长 运行 任务组合成一系列较小的任务。如果您不能将您的任务组合成更小的元素,那么不行 - 没有比再次重新提交整个工作更好的方法了

问题 3 此问题与问题 2 相同。如果节点失败,从任务提交返回 Future 不会对您有很大帮助。 Futures 为您提供等待结果的能力(可选择指定的超时期限)并提供取消任务的可能性。


通常,为了处理节点故障,我会看一下 ExecutionCallback 是否有帮助 - 在这种情况下,您会收到故障通知,我目前假设节点故障属于这种情况。当您的回调收到失败通知时,您可以重新提交作业。

您可能还想看看核心 Hazelcast API 之外存在的其他一些方法。 Hazeltask 是 GitHub 上的一个承诺故障转移处理和任务重新提交的项目 - 所以这可能值得一看?