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

Java Zookeeper读取的数据与文档不完全一致,但创建的znode是否完全一致?,java,apache-zookeeper,distributed-computing,Java,Apache Zookeeper,Distributed Computing,以下是我的假设/疑问。如果我的理解有问题,请说明 通过阅读文档,我理解了这一点 Zookeeper将写入的内容复制到领导者,然后复制到追随者。读请求可以从跟随器(从机)本身提供。因此,读取可能会过时 为什么我们不能使用zookeeper作为缓存系统 由于写入请求总是向Leader发出/重定向,这意味着节点创建是一致的。当两个客户端发送相同节点名称的写入请求时,其中一个客户端将始终收到错误(NodeExistsException) 如果上面是真的,那么我们可以使用zookeeper通过创建一个带有

以下是我的假设/疑问。如果我的理解有问题,请说明

通过阅读文档,我理解了这一点

  • Zookeeper将写入的内容复制到领导者,然后复制到追随者。读请求可以从跟随器(从机)本身提供。因此,读取可能会过时
  • 为什么我们不能使用zookeeper作为缓存系统
  • 由于写入请求总是向Leader发出/重定向,这意味着节点创建是一致的。当两个客户端发送相同节点名称的写入请求时,其中一个客户端将始终收到错误(NodeExistsException)
  • 如果上面是真的,那么我们可以使用zookeeper通过创建一个带有requestId的znode来跟踪重复请求
  • 为了在分布式系统中生成序列号,我们可以使用顺序节点创建
    根据问题和评论中提供的信息,基本问题似乎是: 在无状态多服务器体系结构中,如何最好地防止数据重复,这里的数据是“是否已处理此退款?”

    这被称为“主要基于意见”。有多种方法可以做到这一点,没有一种方法是最好的。你可以用MySQL和Zookeeper来实现

    现在是纯粹的观点和猜测: 要处理退款,必须在某个地方有一些数据库?为什么不检查一下呢?您正在准备的重复请求场景似乎很少发生—这种情况不会每秒发生一百次。如果是这样,那么这个场景就不能保证实现高性能。只需要数据库查找就可以了

    您的工作量似乎是
    1:1
    读写比。每次处理退款时,您都会检查退款是否已处理,如果未处理,则进行处理并输入退款。现在Zookeeper本身最适合
    10:1
    读写比
    。虽然MySQL没有这样的度量标准,但它不需要确保zookeeper为写活动提供某些*保证。因此我希望,对于纯写密集型负载,它应该更好。(*如顺序性、广播、共识等保证)


    只是吹毛求疵,但您的数据是数百(数千?数百万?)个事务ID的线性列表。这正是MySQL(或任何数据库)及其主键构建的目的。Zookeeper适用于更复杂/功能更强大的分层数据。您不需要的。

    。。。节点创建是一致的。。。您使用的“一致性”的定义是什么?目前,我们试图使用mysql唯一密钥阻止重复请求,但我猜mysql并不是为此目的而构建的。我想用zookeeper来阻止它,而不是mysql。对于每个请求id,我将创建一个znode,如果请求重复,我将得到错误“NodeExistsException”。我要求这种类型的一致性。我认为mysql更适合这种情况。如何检查请求是否重复?您对请求的哪些方面进行了检查?身份证件有价值吗?你能举一个重复请求的例子吗?假设有一个api,它在进行一些验证后,根据requestId(param)进行退款。如果用户在不知情的情况下点击了两次,并且点击的是两个不同的服务器(分布式/集群),那么退款可能会被执行两次。这可以通过mysql的唯一键来完成,但我认为mysql并不是为此而构建的。包括mysql意味着dev+devops+DBA(包括zookeeper)只包括dev+devops。DBA出局了。我仍在检查在分布式环境中执行此类检查的最佳选项。