当任务执行集群的机器故障时,需要对任务进行重新分配。按照之前的求模策略,对这台机器还没有处理的任务进行重新分配就比较麻烦,如果实际运行的线上系统,还要在故障时的任务平衡方面花更多的心思。

参考 Elasticsearch 的数据分布设计,每份任务数据都有多个副本,这里假设有两个副本,如下图所示:

一份数据虽然有两个持有者,但持有者持有的副本会进行区分,比如持有的是主副本还是非主副本。

一个任务只会在持有主副本的节点上被执行。

当有机器故障时,任务数据需要进行数据再平衡的工作,比如节点 1 挂了:

节点 1的数据会被迁移到节点 2节点 3上。

当然,也可以用稍微复杂一点的思路,比如对集群中的节点进行角色划分,由协调节点来做这种故障时的任务重新分配工作,考虑到高可用,协调节点可能也需要有 1 至 2 个备用节点以防不测。

使用消息队列时,很多队列不支持exactly once语义,这种情况下需要让用户自己来负责消息的去重或者消费的幂等处理。

最后编辑: kuteng  文档更新时间: 2022-03-22 19:29   作者:kuteng