rabbitmq - 使用路由 key 来通信服务

标签 rabbitmq message-queue soa esb microservices

采用以下示例要求:

Service A does some work. That work is done periodically and no one asks Service A to do it. It's done automatically.

Service B needs to query data produced by Service A. Service A resides in a different server than Service B.

也就是说,如果服务 A 没有提供某种方式来请求数据,服务 B 将无法获取数据。

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

我的问题

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

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

我只是想验证 RabbitMQ 路由键是否满足此要求。例如,服务 A 发送一 strip 有路由 key 072e6ee1-6046-4c3b-bade-9077c863637b 的消息。 服务 B 中有一个消费者,它会忽略路由键来消费任何消息,但一旦产生结果,它就会将消息发布到具有相同路由键的交换器。因此,服务 A 会收到消息,因为它绑定(bind)到整个路由键。

是否可以正确使用路由键

最佳答案

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

  1. 服务 B -> 发送消息以与路由键“process-data”进行交换。该消息在其正文中包含 Id。
  2. 服务 A 监听队列 A 上的消息,该队列通过绑定(bind)键“process-data”绑定(bind)到交换器。然后,它将服务 B 的消息出队,消息正文包含 Id
  3. 服务 A 执行处理
  4. 服务 A -> 发送消息以与路由键“数据处理”进行交换。消息正文中包含原始 ID。
  5. 服务 B 监听队列 B 上的消息,该队列通过绑定(bind)键“data-processed”绑定(bind)到交换器。然后,它将服务 A 的消息出队,消息正文包含 Id

关于rabbitmq - 使用路由 key 来通信服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40585401/

相关文章:

.net - 与容器上RabbitMQ的连接问题

queue - 使用clear命令和mqget api调用来清除队列有什么区别?

java - 如何从Activemq向消费者推送消息

redis - 在redis消息总线中为每个用户创建一个 channel 是一个好习惯吗

design-patterns - 从 SOA 的角度来看,Registry 和 Repository 有什么区别?

c# - 未调用 ServiceAuthorizationManager

web-services - 如何使用 Doctrine2 构建没有敏感字段的 API?

RabbitMQ Shovel 插件卡在 "starting"状态

RabbitMQ队列偷看

Python ActiveMQ : Is it possible to use pika client to work on ActiveMQ?