我们将在我们的项目中使用rabbitmq,但面对一个问题,我们想在我们的开发机器上进行调试,因此必须将响应消息发送到最初发送请求消息的机器。我们将如何实现这一目标,spring-rabbitmq框架中是否存在现有解决方案?
我们考虑了几种解决方案。例如为每台机器声明一组队列,队列名称前缀按机器名称。那可行吗?
答案 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]
要绑定请求和响应消息,您可以使用applicationId
和correlationId
消息属性。
请注意,请求和响应消息都将复制到调试队列。您还可以通过绑定队列以仅匹配特定标头(例如x-match=all, from=[A-Z]
或x-match=all, to=[A-Z]
)来指定请求和响应消息的单独队列,并仅发布仅包含该标头的响应和请求消息(仅from
或者只有to
),但这取决于你。
专业人士:
缺点:
或者,如果调试过程需要实时响应接收,则可以以某种方式使用RPC模式。但这会阻止发布者直到响应处理,这可能与实际的应用程序使用不同,并且会破坏业务逻辑。
优点:
缺点:
p.s:抱歉ascii graph