LMAX Disruptor 通常使用以下方法实现:
如本例所示,Replicator 负责将输入事件\命令复制到从节点。跨一组节点进行复制需要我们应用共识算法,以防我们希望系统在出现网络故障、主故障和从故障时可用。
我正在考虑将 RAFT 共识算法应用于这个问题。一项观察是:“RAFT 要求在复制期间将输入事件\命令存储到磁盘(持久存储)”(参考此链接)
这种观察本质上意味着我们无法执行内存复制。因此,我们可能必须结合复制器和日志器的功能才能成功地将 RAFT 算法应用于 LMAX。
有两种方法可以做到这一点:
选项 1:使用复制的日志作为输入事件队列
- 接收者将从网络读取并将事件推送到复制的日志而不是环形缓冲区
- 一个单独的“阅读器”可以从日志中读取并将事件发布到环形缓冲区。
- 可以使用 RAFT 跨节点复制日志。我们不需要复制器和日志器,因为功能已经由 RAFT 的复制日志完成
我认为这个选项的一个缺点与我们做了一个额外的数据复制步骤(接收器到事件队列而不是环形缓冲区)有关。
选项 2:使用 Replicator 将输入事件\命令推送到从属的输入日志文件
我想知道 Replicator 的设计是否还有其他解决方案?人们为复制器采用了哪些不同的设计选项?特别是任何可以支持内存复制的设计?