Zookeeper读取的文档不完全一致,但是创建znode是否完全一致?

时间:2018-12-31 07:37:41

标签: java apache-zookeeper distributed-computing

以下是我的假设/查询。请说明我的理解是否有误

通过阅读文档,我了解到

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

1 个答案:

答案 0 :(得分:1)

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

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

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

要处理退款,某处必须有一些数据库?为什么不只是反对呢?您准备针对的重复请求方案似乎很少发生-每秒不会发生数百次。如果是这样,则此方案不能保证实现高性能。只是数据库查找就可以了。

您的工作量似乎是1:1的{​​{1}}之比。每次处理退款时,您都要检查是否已处理退款,如果未处理,则进行处理并为其输入一个条目。现在,Zookeeper本身says的使用效果最佳,例如read:write10:1。虽然没有适用于MySQL的度量标准,但它不需要确定Zookeeper为写活动所做的某些保证。因此,我希望对于纯写密集型负载来说应该更好。 (*保证诸如顺序,广播,共识等)

只是一个小问题,但是您的数据是一个包含数百个(数千个,几百万个)交易ID的线性列表。这正是完全构建MySQL(或任何数据库)及其主键的目的。 Zookeeper适用于更复杂/功能更强大的分层数据。不需要。