首页 > 解决方案 > 分布式原子计数器

问题描述

我有一个基于微服务架构的服务。该设计包括 3 个与队列通信的组件。系统组件:

  1. 微服务“A”获取请求并生成子请求。每个子请求都是写入服务“B”队列的队列消息。每个传入消息产生多条消息到队列“B”。
  2. 微服务“B”得到一个任务来执行并执行它。当服务“A”发出的所有子请求都被执行时——该服务将一条消息排入服务“C”队列。只有在消息的所有执行完成后,才会将消息排入下一个队列。
  3. 微服务“C”收到一条消息并将数据库中的行标记为已完成。

他们今天实现的方式是在步骤“1”我创建一个带有任务数初始值的计数器。每次执行服务“B”都会将此计数器减 1。在最后一次执行之后 - 计数器值将为 0 - 然后执行线程将生成一条新消息给服务“C”。此过程确保只有 1 条消息进入队列“C”。

基本上,它正在工作。问题在于递减操作的数量。

今天我将这个计数器实现为一个数据库行(SQL 更新操作是原子的)。它是可靠的,但让我的数据库很难生活。

我想到的其他解决方案:

  1. MySQL 数据库:可靠,相对较慢。吞吐量有限。
  2. Redis:工作速度很快,但我们不能信任它(重启后所有数据都被删除)。
  3. NoSQL:没有很好地处理并发。热点破坏了表演。

想知道这种问题是否有更好的解决方案?

标签: design-patternsdatabase-designarchitecture

解决方案


从 Apache Curator/Zookeeper 或 Apache ignite 查看“Atomic Long”。


推荐阅读