首页 > 解决方案 > 根据文档,Zookeeper 读取不完全一致,但创建 znode 是否完全一致?

问题描述

以下是我的假设/查询。如果我的理解有问题,请指出

通过阅读文档,我了解到

  1. Zookeeper 写入到领导者,它们被复制到跟随者。可以从跟随者(从属)本身提供读取请求。因此阅读可能是陈旧的。
  2. 为什么我们不能使用 zookeeper 作为缓存系统?
  3. 由于写入请求总是发出/重定向到领导者,这意味着节点创建是一致的。当两个客户端发送相同节点名称的写入请求时,其中一个总是会收到错误(NodeExistsException)。
  4. 如果上述情况属实,那么我们是否可以使用 zookeeper 通过创建带有 requestId 的 znode 来跟踪重复请求。
  5. 为了在分布式系统中生成序列号,我们可以使用顺序节点创建。

标签: javaapache-zookeeperdistributed-computing

解决方案


根据问题和评论中提供的信息,基本问题似乎是: 在无状态的多服务器架构中,如何最好地防止数据重复,这里的数据是“是否已处理此退款?”

这符合“主要基于意见”的条件。有多种方法可以做到这一点,没有一种方法是最好的。你可以用 MySQL 来做,也可以用 Zookeeper 来做。

现在是纯粹的意见和猜测:

要处理退款,某处必须有一些数据库?为什么不检查一下呢?您正在准备的重复请求场景似乎很少发生 - 这不会每秒发生数百次。如果是这样,那么这种情况不保证高性能实施。只是数据库查找应该没问题。

您的工作量似乎1:1read:write. 每次处理退款时,您都会检查它是否已处理,如果未处理,则处理它并为其输入条目。现在 Zookeeper 自己说它最适合诸如10:1ratio of 之类的东西read:write。虽然没有可用于 MySQL 的此类指标,但它不需要确保 zookeeper 为写入活动做出某些*保证。因此,我希望对于纯写入密集型负载应该更好。(* 保证,如顺序性、广播、共识等)

只是一个挑剔,但您的数据是数百(数千?数百万?)交易ID的线性列表。这正是MySQL(或任何数据库)及其主键的构建目的。Zookeeper 是为更复杂/更强大的分层数据而设计的。你不需要。


推荐阅读