ZooKeeper是否保证如果节点/ a多次更新,订阅/ a数据的客户端将收到所有更新,而不仅仅是最新的更新?
例如,客户端A可能会尝试更新节点/ a的1k / s次,客户端B是否会接收所有1k / s更新或只接收一部分?我使用Java库来实现我的客户端
答案 0 :(得分:0)
ZooKeeper提供有保证的linearizability和sequential consistency。其Consistency Guarantees上的Apache ZooKeeper文档提供了有关一致性模型的更详细讨论。由于ZooKeeper旨在满足这些属性,因此客户端观察程序会收到所有更新的通知,并且多个并发客户端观察程序都将观察到相同的更新时间轴。 (连接到不同服务器的不同客户端将不会观察到不同的更新顺序。)
ZooKeeper通过将唯一的,单调递增的标识符附加到每个更新(称为zxid)来实现此目的。 zxid值定义了写入事务到系统的总顺序。
ZooKeeper客户端跟踪其上次看到的zxid。如果它意外连接到滞后的ZooKeeper服务器并且没有客户端看到的最新zxid,则连接将中止,客户端将尝试连接到具有最新zxid的另一台服务器。成功连接后,如果服务器具有更新的zxids事务,则会触发与这些事务匹配的任何客户端监视。
记住一些无法保证的事情也很重要。它并不保证所有并发客户端始终遵守完全相同的状态。上面关于一致性保证的文档有一个警告说明,可以解释这一点。
此外,我上面描述的内容仅适用于客户端进程持续运行的情况。如果进程重新启动,则不会保留上次运行中最后一次看到的zxid。新进程将通过从服务器获取新的最新zxid来建立新连接和引导自身。如果在进程关闭时应用了更新,则新的运行进程无法接收这些更改的通知。
编码ZooKeeper客户端以正确处理所有故障模式很棘手,所以我回应评论中的建议,考虑使用Apache Curator。