服务 request/response:您会使用路由键并将消息存储在同一个 RabbitMQ 队列中吗?

Service request/response: would you use routing keys and store messages in the same RabbitMQ queue?

例如,我实现了一个搜索索引服务,它接收搜索请求并使用消息生成响应。

目前我已经定义了一个队列来排队搜索请求和另一个队列来排队搜索结果

您是否可以将其重构为仅排入一个独特的队列,其中消息具有 requestresponse 路由键?还是在这种特殊情况下过度使用 RabbitMQ

经过一些研究,我觉得这应该是一个好的做法:

  • 应该有一个交换。例如 searchrequest.
  • 两个队列,一个用于 传入 请求,另一个用于 响应
  • 整个单个交换应该根据给定的路由键从请求或响应队列中路由消息。
  • 当某些服务执行搜索请求时,发送消息到 searchrequest 交换和 request 路由键。当搜索索引服务创建响应时,也会将其发送到 searchrequest 交换器,但它会使用 response 路由键发布响应消息。

归根结底,在我的特定情况下使用路由键将消息发布到同一队列似乎并不自然。感觉很老套。

听起来您想使用 RPC 模式?要遵循协议,您应该根据 BasicProperties 中的 ReplyToReplyToAddress 发布响应。这样,由调用者(请求者)决定预期发布响应的位置。在我看来,为一种消息类型声明专用交换器可能有点矫枉过正。为了获得更高的性能,您可以使用 direct reply to feature. There are a lot of high level clients 来帮助您处理其中的一些事情。