我正在使用Java Rabbitmq API。我的应用如下所示:
java - 队列同步-LMLPHP

发布者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”-长时间运行的异步工作流。

    您可以在《企业集成模式》一书中阅读有关“流程管理器”的概念,并且周围有很多不错的库可以为您实现这些细节。

  • http://www.enterpriseintegrationpatterns.com/patterns/messaging/ProcessManager.html
  • http://kellabyte.com/2012/05/30/clarifying-the-saga-pattern/
  • 关于java - 队列同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39445887/

    10-10 08:55