采用以下示例要求:
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,以便您可以将收到的响应异步匹配出站请求)将包含在消息正文中。因此,您有以下设置:
- 服务 B -> 发送消息以与路由键“process-data”进行交换。该消息在其正文中包含 Id。
- 服务 A 监听队列 A 上的消息,该队列通过绑定(bind)键“process-data”绑定(bind)到交换器。然后,它将服务 B 的消息出队,消息正文包含 Id
- 服务 A 执行处理
- 服务 A -> 发送消息以与路由键“数据处理”进行交换。消息正文中包含原始 ID。
- 服务 B 监听队列 B 上的消息,该队列通过绑定(bind)键“data-processed”绑定(bind)到交换器。然后,它将服务 A 的消息出队,消息正文包含 Id
关于rabbitmq - 使用路由 key 来通信服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40585401/