Java 确保收到的Rabbit MQ事件的顺序

Java 确保收到的Rabbit MQ事件的顺序,java,rabbitmq,Java,Rabbitmq,我有一个服务a,其功能如下: 创建/更新人员并发布创建/更新事件 还要将人员职务数据保存在服务B的数据库中 服务B在其数据库中保存/更新数据时,会触发其自己的创建/更新事件 现在,我从另一个服务C中的服务A和B接收这两个RabbitMQ事件。我有一个要求,需要确保我首先从服务A接收事件,然后通过从服务B的事件中提取数据来更新该事件数据中的字段。我有以下问题 我可以假设A在B之前生成事件,在我的服务C中,我总是先收到A,然后收到B吗 如果没有,我如何保证我将始终在B之前举办服务A活动 在进

我有一个服务a,其功能如下:

  • 创建/更新人员并发布创建/更新事件
  • 还要将人员职务数据保存在服务B的数据库中
服务B在其数据库中保存/更新数据时,会触发其自己的创建/更新事件

现在,我从另一个服务C中的服务A和B接收这两个RabbitMQ事件。我有一个要求,需要确保我首先从服务A接收事件,然后通过从服务B的事件中提取数据来更新该事件数据中的字段。我有以下问题

  • 我可以假设A在B之前生成事件,在我的服务C中,我总是先收到A,然后收到B吗

  • 如果没有,我如何保证我将始终在B之前举办服务A活动

  • 在进行一些初始测试时,我可以看到我先收到A,然后收到B,相差0.0001秒(这很好)。但这似乎是一条快乐的道路

    任何帮助都将不胜感激

  • 没有
  • 不可能
  • 解决此问题的唯一方法是使用一些唯一的ID标记消息,以便来自A和B的消息具有相同的ID,并等待这两条消息

  • 没有
  • 不可能

  • 解决此问题的唯一方法是使用一些唯一的ID标记邮件,以便来自A和B的邮件具有相同的ID,并等待这两条邮件。

    此答案可能有助于指导您:

    根据这个答案,他们说“对于多个(并行)消费者,无法保证处理顺序。”


    如果来自“服务A”的消息具有唯一标识符,并且包含在来自“服务B”的消息中,那么您在“服务C”中可以做的一件事是,当您从“服务B”拾取消息时,检查您是否收到来自“服务A”的唯一标识符。如果没有,那么您可以发送一个NACK,它将对消息重新排队,直到您可以完全处理它。但这可能会变得一团糟。

    这个答案可能有助于指导您:

    根据这个答案,他们说“对于多个(并行)消费者,无法保证处理顺序。”


    如果来自“服务A”的消息具有唯一标识符,并且包含在来自“服务B”的消息中,那么您在“服务C”中可以做的一件事是,当您从“服务B”拾取消息时,检查您是否收到来自“服务A”的唯一标识符。如果没有,那么您可以发送一个NACK,它将对消息重新排队,直到您可以完全处理它。但这可能会变得混乱。

    因为您没有说明使用的是哪个框架或库,但不管如何,您都可以在消息中发送DB版本。收到消息后,如果版本不是与消息匹配的最新版本,则您可以使用正确的信息拒绝重新查询消息。可能还有其他方法。因为您没有说您正在使用哪个框架或库,但不管如何,您都可以在消息中发送DB版本。收到消息后,如果版本不是与消息匹配的最新版本,则您可以使用正确的信息拒绝重新查询消息。也可能有其他方法。从事件返回的对象包含唯一的personId字段。从事件返回的对象包含唯一的personId字段。从事件返回的对象包含唯一的personId字段。从事件返回的对象包含唯一的personId字段。