java - 根据文档,Zookeeper 读取不完全一致,但创建 znode 是否完全一致?
问题描述
以下是我的假设/查询。如果我的理解有问题,请指出
通过阅读文档,我了解到
- Zookeeper 写入到领导者,它们被复制到跟随者。可以从跟随者(从属)本身提供读取请求。因此阅读可能是陈旧的。
- 为什么我们不能使用 zookeeper 作为缓存系统?
- 由于写入请求总是发出/重定向到领导者,这意味着节点创建是一致的。当两个客户端发送相同节点名称的写入请求时,其中一个总是会收到错误(NodeExistsException)。
- 如果上述情况属实,那么我们是否可以使用 zookeeper 通过创建带有 requestId 的 znode 来跟踪重复请求。
- 为了在分布式系统中生成序列号,我们可以使用顺序节点创建。
解决方案
根据问题和评论中提供的信息,基本问题似乎是: 在无状态的多服务器架构中,如何最好地防止数据重复,这里的数据是“是否已处理此退款?”
这符合“主要基于意见”的条件。有多种方法可以做到这一点,没有一种方法是最好的。你可以用 MySQL 来做,也可以用 Zookeeper 来做。
现在是纯粹的意见和猜测:
要处理退款,某处必须有一些数据库?为什么不检查一下呢?您正在准备的重复请求场景似乎很少发生 - 这不会每秒发生数百次。如果是这样,那么这种情况不保证高性能实施。只是数据库查找应该没问题。
您的工作量似乎1:1
是read:write
. 每次处理退款时,您都会检查它是否已处理,如果未处理,则处理它并为其输入条目。现在 Zookeeper 自己说它最适合诸如10:1
ratio of 之类的东西read:write
。虽然没有可用于 MySQL 的此类指标,但它不需要确保 zookeeper 为写入活动做出某些*保证。因此,我希望对于纯写入密集型负载应该更好。(* 保证,如顺序性、广播、共识等)
只是一个挑剔,但您的数据是数百(数千?数百万?)交易ID的线性列表。这正是MySQL(或任何数据库)及其主键的构建目的。Zookeeper 是为更复杂/更强大的分层数据而设计的。你不需要。
推荐阅读
- javascript - 如何修复与可拖动画布的碰撞?
- watchkit - 在哪里可以找到有关使用 Apple Watch 和 watchOS 读取分贝级别的文档?
- server - Red5pro libred5pro-crypto-5.2.4.so | Red5pro 设置错误
- r - 突然ggplot崩溃R工作室,有什么建议吗?
- python - Dask优化中的ALS算法
- python - 将特定输入传递给另一个函数
- vue.js - Ionic Vue 3 应用程序从另一个选项卡切换选项卡
- excel - 如何计算包含包含特定文本的单元格的行数?
- c++ - 为什么在第二遍中没有渲染深度纹理?
- android - 如何从 Android 库中创建和显示片段?