我正在使用Java Rabbitmq API。我的应用如下所示:
发布者A
将作业发送到Q1
,然后许多使用者B
进行该作业并创建新作业,然后将其发送到Q2
,其中许多使用者C
进行该作业。
我想确保没有重复的作业发送到Q2
,如何实现呢?
请注意以下两种情况:
B
在将作业发送到Q2
之后但在向Q1
发送确认他已完成作业向
B
发送确认之后但向Q1
发送作业之前Q2
崩溃最佳答案
我想确保没有重复的作业发送到Q2,如何实现?
你不能。即使在第一季度也没有。
分布式系统的性质和CAP定理(https://en.wikipedia.org/wiki/CAP_theorem)表示这是不可能的,即使目标在大多数时间都已实现。
鉴于此,您需要做的是计划如何处理意外创建重复消息的时间。
最常见的方法是某种幂等(https://en.wikipedia.org/wiki/Idempotence)-一种确保同一消息仅被处理一次的方法。或者,也许更准确地说,是一种说法,该消息可以无限次地处理,但是只会导致更改/对系统产生一次影响。
但是,总的来说,您的情况是,多个队列且需要处理顺序的使用者需要一个“Saga”或“Process Manager”-长时间运行的异步工作流。
您可以在《企业集成模式》一书中阅读有关“流程管理器”的概念,并且周围有很多不错的库可以为您实现这些细节。
关于java - 队列同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39445887/