我们有一个RabbitMQ交换,它在我们系统的几个组件之间交换消息。
每个组件都是交换的发布者和订阅者。
我们需要找到一种方法来确保每个应用程序都不会收到它发送到交换中的消息。
例如。
App 1发送刷新消息。除了App 1之外,我们希望将其发送给交换的所有订阅者
我可以看到你可以指定路由属性,但这似乎定义了你不想要的消息。
有什么想法吗?
答案 0 :(得分:3)
RabbitMQ无法直接询问您的要求。它有点落后于RMQ的工作方式,以及系统应该如何设计。
也就是说,您无法过滤或“选择性”了解给定消费者收到的消息。最终,the "selective consumer" is an anti-pattern in RabbitMQ。一旦消息在队列中,侦听该队列的消费者可能会收到该消息(取决于连接的消费者数量等)。
根据我的经验,处理此问题的最佳方法是更改RMQ拓扑和应用程序设计,以便这不会成为问题(可能无法实现)或让您的应用知道它发送了哪条消息,并忽略它发送的任何内容。
我认为第一个选项更好(确保这不会发生好的app /拓扑设计),但第二个选项通常更容易......
为此,您可以在邮件中添加自定义属性,例如“publisher-id”或类似内容。检查您的消费者代码,以确保消息的发布者ID 不与其自己的publisher-id匹配。如果确实匹配,请不要再做消息。如果不匹配,请正常处理消息。
答案 1 :(得分:0)
您可以为每个组件分配单独的路由密钥(例如app1
,app2
,app3
,...),并将每个组件订阅到除其自己之外的所有其他路由密钥。< / p>
因此,当App 1发送消息时,它会使用路由密钥app1
发送消息,但它仅订阅app2
,app3
,....