【发布时间】:2023-03-04 20:49:01
【问题描述】:
背景
让我们想象一个分布式系统,在微服务架构上,并行处理队列消息。本系统有两种应用:A和B。
A 是一个获取处理请求的 REST API 应用程序。每个请求都被转换为解决该请求的子任务列表。所以,一旦A收到一个新的请求,它就会在B应用的队列中插入N条消息。 N 是一个动态值,它是每个输入请求的变化。
一旦处理完成(所有N个项目都处理成功),我们将通知客户(请求者)总结果。
可能的解决方案
假设一个请求有 N 个子任务要处理。我们的应用程序A 将创建一个初始化值为 N 的原子计数器。应用程序B 每次处理来自队列的消息时,都会将计数器减 1 并查看其新值。
最后一次处理将在计数器上留下值“0”。一旦应用程序检测到值“0”,应用程序B 将通知客户处理结果。
问题
上述可能的解决方案有两个主要缺点:
- 您必须有一个可以同步所有常规进度的原子计数器。没有它,您将无法知道任务何时完成。
- 许多分布式队列系统,如 Google PubSub,采用“至少一次”传递 (source) 的方法,这意味着同一消息可以从队列中多次出列。这最终将导致在处理所有队列消息之前通知客户。
问题
当使用像 Google PubSub 这样的队列系统时,解决上述问题的正确方法是什么?
【问题讨论】:
-
队列对于此类用例来说是错误的抽象。看看像 temporal.io 这样的编排器,它为动态任务协调提供直接支持。
标签: architecture microservices distributed-computing google-cloud-pubsub