design-patterns - 分布式原子计数器
问题描述
我有一个基于微服务架构的服务。该设计包括 3 个与队列通信的组件。系统组件:
- 微服务“A”获取请求并生成子请求。每个子请求都是写入服务“B”队列的队列消息。每个传入消息产生多条消息到队列“B”。
- 微服务“B”得到一个任务来执行并执行它。当服务“A”发出的所有子请求都被执行时——该服务将一条消息排入服务“C”队列。只有在消息的所有执行完成后,才会将消息排入下一个队列。
- 微服务“C”收到一条消息并将数据库中的行标记为已完成。
他们今天实现的方式是在步骤“1”我创建一个带有任务数初始值的计数器。每次执行服务“B”都会将此计数器减 1。在最后一次执行之后 - 计数器值将为 0 - 然后执行线程将生成一条新消息给服务“C”。此过程确保只有 1 条消息进入队列“C”。
基本上,它正在工作。问题在于递减操作的数量。
今天我将这个计数器实现为一个数据库行(SQL 更新操作是原子的)。它是可靠的,但让我的数据库很难生活。
我想到的其他解决方案:
- MySQL 数据库:可靠,相对较慢。吞吐量有限。
- Redis:工作速度很快,但我们不能信任它(重启后所有数据都被删除)。
- NoSQL:没有很好地处理并发。热点破坏了表演。
想知道这种问题是否有更好的解决方案?
解决方案
从 Apache Curator/Zookeeper 或 Apache ignite 查看“Atomic Long”。
推荐阅读
- solr - 在 Lucene 中搜索逗号分隔的文本
- eclipse-plugin - Eclipse PDE:在我的插件中的 Oxygen 更新 javafx 实现后引发 Classnotfound 异常
- javascript - mapStateToProps 将数据传递给道具
- c# - 类型参数不是从上下文中推断出来的
- scala - 在 `LabelledGeneric` 等中使用 `String` 而不是 `Symbol`
- ios - wkWebView 加载请求失败,错误域=NSURLErrorDomain 代码=-999
- c# - Wacom Signature SDK 重新设计按钮
- javascript - 异步行为。递归 setTimeout 未完成
- firebase - Firebase 检查部署的文件
- rust - 为什么我的 actix 主管不重试停止的演员?