我正在尝试实现一个协作 Canvas ,许多人可以在其中徒手绘制或使用特定的形状工具进行绘制。 服务器是用 Node.js 开发的,客户端是用 Angular1-js 开发的(我对它们都很陌生)。 我必须使用共识算法,以便始终向所有用户显示相同的内容。
我遇到了严重的麻烦,因为我找不到正确的使用教程。我一直在寻找和研究 Paxos 实现,但似乎 Raft 在实际中使用得非常多。
有什么建议吗?我真的很感激。
最佳答案
编写分布式系统并不是一项容易的任务[1],因此我建议使用一些现有的强一致性系统,而不是从头开始实现。通常的嫌疑人是 zookeeper , consul , etcd , atomix/copycat 。其中一些提供 Nodejs 客户端:
我个人从未将它们与nodejs一起使用过,所以我不会评论客户端的成熟度。
如果你坚持自己实现共识,那么 raft 应该更容易理解——这篇论文出人意料地容易理解 https://raft.github.io/raft.pdf 。他们也有一些 Nodejs 实现,但同样,我没有使用过它们,所以很难推荐任何特定的实现。 Gaggle readme包含一个示例和 skiff has an integration test其中记录了其用法。
退一步来说,我不确定分布式共识是否是您所需要的。看起来你有多个客户端和一个服务器。您也许可以使用集中式数据存储。问题域并不是真正的分布式 - 当服务器根据 FIFO 接收到形状时,形状可以一个一个地叠加在另一个之上(想象一下多个人在同一个白板上书写,最后一个获胜)。挑战在于对现有形状的并发修改,也许您可以回退到最后/第一个更改获胜或类似的情况。
这里探索的另一个有趣的途径是 Conflict-free Replicated Data Types — CRDT 。 github 上的人们使用它们在 Atom 中实现协作“结对”编程。请参阅the atom teletype blog post ,还有their implementation也许有用,因为协作编辑似乎正是您试图解决的问题。
希望这有帮助。
[1]看看jepsen系列https://jepsen.io/analyses其中 Kyle Kingsbury 测试了分布式数据存储的各种故障条件。
关于angularjs - Node.js 的共识算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47571033/