Rabbitmq 使用路由密钥通信服务

Rabbitmq 使用路由密钥通信服务,rabbitmq,message-queue,soa,esb,microservices,Rabbitmq,Message Queue,Soa,Esb,Microservices,以以下要求为例: 服务A做了一些工作。这项工作是定期完成的,没有人要求服务A去做。这是自动完成的 服务B需要查询由服务A生成的数据服务A驻留在与服务B不同的服务器上 也就是说,如果服务A没有提供请求数据的方法,那么服务B将无法获取数据 我想通过使用RabbitMQ的SOA方式要求服务A数据:当服务B需要一些数据时,它会向给定的交换发送一条消息,并将其写入某个队列。然后,服务A处理该消息并将答案发布到其他某个exchange。最后,服务B侦听应答消息,循环结束 我的问题 我需要某种方法来发布和使用

以以下要求为例:

服务A做了一些工作。这项工作是定期完成的,没有人要求服务A去做。这是自动完成的

服务B需要查询由服务A生成的数据服务A驻留在与服务B不同的服务器上

也就是说,如果服务A没有提供请求数据的方法,那么服务B将无法获取数据

我想通过使用RabbitMQ的SOA方式要求服务A数据:当服务B需要一些数据时,它会向给定的交换发送一条消息,并将其写入某个队列。然后,服务A处理该消息并将答案发布到其他某个exchange。最后,服务B侦听应答消息,循环结束

我的问题 我需要某种方法来发布和使用由向服务A请求数据的操作标识的消息,并且我还需要每个启动的操作都可以由唯一标识符标识

我的问题是关于如何发布消息并能够接收操作特定调用的答案

我只想验证RabbitMQ路由密钥是否满足此要求。例如,服务A发送带有路由密钥的消息
072e6ee1-6046-4c3b-bade-9077c863637b
服务B中有一个使用者,它会使用忽略路由密钥的任何消息,但一旦产生结果,它就会使用相同的路由密钥将消息发布到exchange。因此,服务A接收消息,因为它绑定到整个路由密钥


这可能是正确使用路由密钥吗?

如果我理解正确,这似乎不是正确使用路由密钥的方法。路由键通常用于定义操作,例如“做这个”或“做那个”——我不希望它们包含键,除非这些键是定义系统如何操作的有限集。您提到的ID(它们似乎是相关ID,以便您可以异步地将接收到的响应与出站请求相匹配)将包含在消息体中。因此,您有以下设置:

  • 服务B->使用路由键“流程数据”向exchange发送消息。消息正文中包含Id
  • 服务A侦听队列A上的消息,队列A使用绑定密钥“process data”绑定到exchange。然后它将退出服务B的消息队列,该消息的主体包含Id
  • 服务A执行处理
  • 服务A->使用路由键“数据已处理”向exchange发送消息。消息正文中包含原始Id
  • 服务B侦听队列B上的消息,队列B使用绑定密钥“data processed”绑定到exchange。然后它将退出服务A的消息队列,该消息的正文包含Id

  • 最后,RabbitMQ已经提供了一个解决方案来解决我的场景:

    在一天结束时,消息可以有相关id回复字段:

    • 相关id。用于跨多个交换机/队列唯一标识操作的任意值

    • 回复。一个任意的
      字符串
      ,用于定义要将给定操作的结果放在哪个exchange或队列上。目标交换/队列将是操作将接收的回调信息

    因此,服务A使用相关id回复值向给定的交换发送消息。订阅回复交易所。当服务B处理该消息时,它将消息发布到“回复到exchange”中,服务a接收整个结果

    顺便说一句,我仍然对这个模型有一些担心,因为在等待结果时,您需要接收来自其他操作的回调消息,并且每当您使用未标记有所需的相关id的消息时,您只是不处理它,而是等待下一个,依此类推,直到你得到你想要的

    也许将回调消息排入队列是个好主意,这样,如果启动操作的人不再等待回调,那么给定的回调消息将自动丢弃

    另一种方法是将回调信息作为文档或记录抛出到SQL/NoSQL数据库中,并通过回调标识符使用索引查询轮询数据库


    如果我找到使用RabbitMQ的其他方法,我将更新我的答案

    嘿!谢谢你的回答。我关心的是,在第五步中,服务B如何接收消息?它是否需要使用所有消息并按
    Id
    对其进行过滤,并确认具有所需
    Id
    的消息?这就是考虑路由密钥的原因,因为我可以接收消息,而不会浪费大量资源来接收我不想接收的消息。我仍在寻找最佳解决方案,我发现你也可以使用消息头。也许这就是解决办法?消息头而不是路由键见我自己的答案,我相信这应该是一个很好的解决方案,不是吗?嗯,在测试了我找到的解决方案后,似乎消费者无法通过消息头进行过滤。它的目的就是在配置头文件交换绑定时这样做……我发现RMQ帮助页面很有用。您可能需要查看主题交换: