Node.js 的共识算法

Consensus algorithm for Node.js

我正在尝试实现协作 canvas,其中许多人可以徒手或使用特定的形状工具进行绘图。 服务器是在 Node.js 中开发的,客户端是使用 Angular1-js 开发的(我对它们都很陌生)。 我必须使用共识算法才能向所有用户显示相同的内容。

我遇到了严重的麻烦,因为我找不到合适的教程来使用它。我一直在寻找和研究 Paxos 实现,但似乎 Raft 在实际中非常有用。

有什么建议吗?非常感谢。

尝试阅读文章引用的 Understanding Paxos. It's geared towards software developers rather than an academic audience. For this particular application you may also be interested in the Multi-Paxos Example Application。它旨在帮助说明共识算法背后的概念,而且听起来它几乎正是您对该应用程序所需要的。 Raft 和大多数 Multi-Paxos 设计往往会陷入过多的累积历史,从而产生一系列新的问题来处理超出简单一致性的问题。初始原型可以轻松处理在每次更新时发送绘图的完整状态并完全忽略历史问题,这就是示例应用程序所做的。可以进行后期优化以减少网络开销。

编写分布式系统不是一件容易的事[1],所以我建议使用一些现有的强一致性系统,而不是从头开始实施。通常的嫌疑人是 zookeeper, consul, etcd, atomix/copycat。其中一些提供 nodejs 客户端:

虽然我个人从未在 nodejs 中使用过它们中的任何一个,所以我不会评论客户的成熟度。

如果你坚持自己实现共识,那么 raft 应该更容易理解——这篇论文出奇地容易理解 https://raft.github.io/raft.pdf. They also have some nodejs implementations, but again, I haven't used them, so it is hard to recommend any particular one. Gaggle readme contains an example and skiff has an integration test 记录了它的用法。

退一步说,我不确定这里是否需要分布式共识。好像您有多个客户端和一个服务器。您或许可以使用集中式数据存储。问题域实际上也不是那么分布式——当服务器根据 FIFO 接收形状时,它们可以一个接一个地叠加(想象多个人在同一个白板上书写,最后一个获胜)。挑战在于同时修改现有形状,也许你可以回退到 last/first 改变胜利或类似的东西。

这里探索的另一个有趣途径是 Conflict-free Replicated Data Types — CRDT. Folks at github used them to implement collaborative "pair" programming in atom. See the atom teletype blog post, also their implementation 可能有用,因为协同编辑似乎正是您要解决的问题。

希望对您有所帮助。

[1] 查看 Jepsen 系列 https://jepsen.io/analyses,其中 Kyle Kingsbury 测试分布式数据存储的各种故障情况。