使用路由密钥来传递服务

时间:2016-11-14 09:26:59

标签: rabbitmq message-queue soa esb microservices

采取以下样本要求:

  

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

     

服务B 需要查询服务A 生成的数据。 服务A 位于与服务B 不同的服务器中。

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

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

我的问题

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

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

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

是否可以正确使用路由密钥

2 个答案:

答案 0 :(得分:2)

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

  1. 服务B - &gt;发送消息以与路由密钥'process-data'交换。该消息在其正文中包含Id。
  2. 服务A侦听队列A上的消息,该消息绑定到具有绑定密钥“process-data”的交换。然后它出列服务B的消息,其正文包含Id
  3. 服务A执行处理
  4. 服务A - &gt;使用路由密钥'data-processed'发送消息进行交换。该邮件包含其正文中的原始ID。
  5. 服务B侦听队列B上的消息,队列B绑定到具有绑定密钥“data-processed”的交换。然后它出列服务A的消息,其正文包含Id

答案 1 :(得分:0)

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

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

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

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

因此,服务A 会向相关ID 回复值的给定交易所发送消息。它被订阅回复交换。当服务B 处理消息时,它会向回复交换发布消息,服务A 会收到整个结果。

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

也许将回调消息排队with a time-to-live可能是一个好主意,因此如果谁开始操作不再等待回调,则会自动给出一个给定的回调消息丢弃。

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

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