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

时间:2015-02-12 17:09:34

标签: java hazelcast

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

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

  

工作队列没有高可用性:每个成员都会创建一个或   更多本地ThreadPoolExecutors与普通的工作队列   真正的工作。提交任务时,它将被放在工作队列中   那个ThreadPoolExecutor并不会被Hazelcast备份。如果   该成员会发生一些事情,所有未经处理的工作都会发生   丢失。

任务:

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

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

所以每个节点都在处理某些事情。虽然他们都在处理一些奴隶失败的事情

问题:

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

1 个答案:

答案 0 :(得分:1)

我假设通过'故障处理'你正在谈论群集中的节点发生故障的情况....

问题1 不自动。您认为Hazelcast的执行任务不具有容错能力是正确的。但是,如果您能够处理任务失败,我就看不出您无法将工作重新提交给群集中其他成员的原因。

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

问题3 同样的问题也适用于这个问题2.如果节点出现故障,从任务提交中返回未来将无法帮助您。期货为您提供了对结果进行等待(可选择在指定的超时期限内)的能力,并提供取消任务的可能性。


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

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