使用路由键来通信服务

Using routing key to communicate services

采用以下示例要求:

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服务A数据SOA方式:当服务 B 需要一些数据,它将消息发送到给定的交换器并将其写入某个队列。然后,服务 A 处理消息并将 answer 发布到其他交换。最后,服务 B 侦听 应答消息 并且循环结束。

我的问题

我需要一些方法来发布和使用请求数据到 服务 A 的操作所标识的消息,并且我还需要每个启动的操作都可以通过 [= =28=]唯一标识符.

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

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

是否可以正确使用路由键

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

  1. 服务 B -> 发送消息与路由键交换 'process-data'。邮件正文中包含 Id。
  2. 服务 A 侦听队列 A 上的消息,队列 A 通过绑定密钥 'process-data' 绑定到交换。然后它将服务 B 的消息出列,其主体包含 Id
  3. 服务 A 执行处理
  4. 服务 A -> 发送消息与路由键交换 'data-processed'。该消息在其正文中包含原始 Id。
  5. 服务 B 侦听队列 B 上的消息,队列 B 通过绑定密钥 'data-processed' 绑定到交换。然后它将服务 A 的消息出列,其主体包含 Id

最后,RabbitMQ已经提供了方案来解决我的场景:Remote Procedure Calls tutorial.

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

  • 关联 ID。用于在多个 exchanges/queues 中唯一标识操作的任意值。

  • 回复。任意 string 来定义要将给定操作的结果放在哪个交换器或队列上。目标 exchange/queue 将是操作将接收的 回调 信息。

因此,服务 A 向给定的交换发送消息,其中包含 相关 ID 回复 值。它订阅了 回复 交换。 服务 B 处理消息时,它会向 回复交换 服务 A 接收消息整个结果。

顺便说一句,我对这个模型还有一些顾虑,因为您需要在等待结果时接收来自其他操作的回调消息,并且每当您使用未标记所需 correlation 的消息时id,你根本不处理它,你等待下一个,依此类推,直到你得到你想要的。

回调消息 排队可能是个好主意with a time-to-live 所以如果开始操作的人不再等待回调,给定的回调消息将被自动删除。

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

如果我发现使用 RabbitMQ 的其他方法,我会更新我的答案。