为了让自己相信 Paxos 和 Raft 等标准算法的复杂性是必要的,必须理解为什么更简单的解决方案不能令人满意。假设,为了对 N 台机器集群中的事件流达成共识(即实现复制的时间增长日志),提出以下算法:
每当一台机器想要将一条消息附加到日志时,它就会广播元组
(msg, rnd, prev)
,其中msg
是消息,rnd
是一个随机数,prev
是日志中最后一条消息的 ID。当机器接收到一个元组时,它
msg
作为 的一个子插入prev
,形成一棵树。如果一个节点有多个孩子,只有最高的一个
rnd
被认为是有效的;有效消息通过树的路径是主链。如果一条消息是主链的一部分,并且它足够老,则它被认为是决定/最终的。
如果一台机器尝试提交一条消息,但过了一段时间,它不在主链上,这意味着另一台机器大致同时广播了一条消息,所以你重新广播它直到它在那里。
看起来简单、高效且对崩溃具有弹性。这个算法会起作用吗?