请考虑以下样本要求: 服务A做了一些工作。这项工作是定期完成的,没有人要求服务A这样做。它是自动完成的。 服务B需要查询数据……
如果我理解正确的话,这似乎不是使用路由键的正确方法。路由键往往用于定义操作,例如'do-this'或'do-that' - 我不希望它们包含密钥,除非这些密钥是定义系统运行方式的有限集。您提到的ID(它们似乎是相关ID,以便您可以异步地将接收到的响应与出站请求匹配)将包含在消息正文中。因此,您有以下设置:
最后,RabbitMQ已经提供了解决方案的解决方案: 远程过程调用教程 。
在一天结束时,可以有一条消息 的 相关id 强> 和a 的 回复 强> 字段:
的 相关id 强> 。用于唯一标识跨多个交换/队列的操作的任意值。
的 回复 强> 。任意的 string 定义要在哪个交换或队列中放置给定操作的结果。目标交换/队列将是 打回来 操作将收到的信息。
string
从而, 的 服务A. 强> 使用a向给定的交换发送消息 的 相关id 强> 和a 的 回复 强> 值。它被订阅了 的 回复 强> 交换。什么时候 的 服务B. 强> 处理它向消息发布消息的消息 回复交流 和 的 服务A. 强> 收到整个结果。
顺便说一句,我仍然对这个模型有一些顾虑,因为你需要在等待结果的同时接收来自其他操作的回调消息,并且每当你消费没有标记为期望的消息时 的 相关id 强> ,你只是不处理它,你等待下一个,依此类推,直到你得到你想要的。
也许这可能是一个好主意 回调消息 会排队 用一个 时间到现场 因此,如果谁开始操作不再等待回调,则会自动删除给定的回调消息。
另一种方法是将回调信息作为文档或记录放在SQL / NoSQL数据库中,并使用索引查询轮询数据库 通过回调标识符 ...
如果我找到使用RabbitMQ的其他方法,我会更新我的答案。