RabbitMQ:使用一个队列服务器时,单独的消费者 - 生产者

时间:2013-12-27 04:13:34

标签: rabbitmq amqp spring-amqp spring-rabbit

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

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

1 个答案:

答案 0 :(得分:1)

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

 [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]x-match=all, to=[A-Z])来指定请求和响应消息的单独队列,并仅发布仅包含该标头的响应和请求消息(仅from或者只有to),但这取决于你。

专业人士:

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

缺点:

  • 使用来自RabbitMQ方面的更多资源

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

优点:

  • 逐步调试过程

缺点:

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

p.s:抱歉ascii graph