我是Hazelcast的新手。因此,有一个关于并行处理期间最佳故障处理实践的问题:
掌握Hazelcast,第6.6节,p。 96:
工作队列没有高可用性:每个成员都会创建一个或 更多本地ThreadPoolExecutors与普通的工作队列 真正的工作。提交任务时,它将被放在工作队列中 那个ThreadPoolExecutor并不会被Hazelcast备份。如果 该成员会发生一些事情,所有未经处理的工作都会发生 丢失。
任务:
假设我有1个主节点和2个从属节点。我用
启动了耗时的任务executor.submitToAllMembers (new TimeConsumingTask())
所以每个节点都在处理某些事情。虽然他们都在处理一些奴隶失败的事情
问题:
TimeConsumingTask
是Runnable
)TimeConsumingTask
是Callable
并且我想获得a Future
作为集群计算结果)答案 0 :(得分:1)
我假设通过'故障处理'你正在谈论群集中的节点发生故障的情况....
问题1 不自动。您认为Hazelcast的执行任务不具有容错能力是正确的。但是,如果您能够处理任务失败,我就看不出您无法将工作重新提交给群集中其他成员的原因。
问题2 很难知道你的TimeConsumingTask实际上在做什么 - 就像任何分布式执行引擎一样,将长时间运行的任务组合成一系列较小的任务通常会更好。如果你不能把你的任务写成更小的元素,那么不 - 没有比再次重新提交整个工作更好的方法
问题3 同样的问题也适用于这个问题2.如果节点出现故障,从任务提交中返回未来将无法帮助您。期货为您提供了对结果进行等待(可选择在指定的超时期限内)的能力,并提供取消任务的可能性。
通常,为了处理节点失败,我会看看ExecutionCallback是否会有所帮助 - 在这种情况下,您会收到有关故障的通知,我当前正在假设节点故障属于此范围。当您的回调被通知失败时,您可以重新提交作业。
您可能还想查看核心Hazelcast API之外存在的其他一些方法。 Hazeltask是GitHub上的一个项目,它承诺故障转移处理和任务重新提交 - 所以这可能值得一看?