1

我们将在我们的项目中使用rabbitmq,但面临一个问题,我们想在我们的开发机器上调试,所以必须将响应消息发送到最初发送请求消息的机器。我们将如何实现这一目标,spring-rabbitmq 框架中是否有现有的解决方案?

我们考虑了几种解决方案。比如为每台机器声明一组队列,队列名前缀为机器名。这可行吗?

4

1 回答 1

1

定义队列集(调试队列 AZ)并将它们绑定到具有属性的标头交换,x-match=any, from=[A-Z], to=[A-Z]分别为 . 然后将标头交换绑定到您的主要工作交换(一个或多个)以接收您感兴趣的所有消息,因此当您的消费者发布响应时,它将被复制到您的调试交换,然后路由到适当的队列。

 [sender X]   [     worker      ]                       [consumer on queue X]
     |            ^          |                 
 [request]        |      [response from=X, to=X]      [duped request from=X|                 
      \           |          |                        [duplicated response from=X, to=X]
       \  [request from=X]   |                                 ^
        v         |          V                                 |
      [working topic exchange]           -------> [debug headers exchange]
       /           |         \                   /           |         \
   {bindings by routing key mask}           {bindings by any headers from=[A-Z], to=[A-Z]}
     /             |           \               /             |           \
[working queue 1] ...  [working queue N]   [debug queue A]  ...  [debug queue Z]

要绑定请求和响应消息,您可以使用applicationIdcorrelationId消息属性。

请注意,请求和响应消息都将复制到调试队列中。您还可以通过绑定队列来为请求和响应消息指定单独的队列以仅匹配特定的标头,例如x-match=all, from=[A-Z]orx-match=all, to=[A-Z]并发布仅具有该标头的响应和请求消息(仅from或仅to),但这取决于您。

优点:

  • 易于实施
  • 需要最少的代码更改
  • 易于打开/关闭
  • 可以在生产环境中安全运行

缺点:

  • 从 RabbitMQ 端使用更多资源

或者,如果您的调试过程需要实时响应接收,您可以以某种方式利用RPC模式。但这将阻止发布者直到响应处理,这可能与实际应用程序的使用不同并破坏业务逻辑。

优点:

  • 逐步调试过程

缺点:

  • 难以实施
  • 可能需要大量代码更改
  • 打破业务逻辑
  • 难以启用/禁用
  • 不安全的生产环境

ps: 对不起 ascii 图

于 2013-12-27T18:41:17.120 回答