Rabbitmq 过滤

Rabbit MQ Filtering

我们有一个 RabbitMQ 交换器,它在我们系统的几个组件之间交换消息。

每个组件都是交换的发布者和订阅者。

我们需要找到一种方法来确保每个应用程序都不会收到它发送到交换器中的消息。

例如

App 1 发送刷新消息。我们希望它发送给除 App 1

之外的所有交易所订阅者

我看到您可以指定路由属性,但这似乎定义了您想要的消息,而不是您不想要的消息。

有什么想法吗?

RabbitMQ 无法直接满足您的要求。这与 RMQ 的工作方式以及系统的设计方式有点落后。

也就是说,您无法过滤或"selective"了解给定消费者收到的消息。最终,the "selective consumer" is an anti-pattern in RabbitMQ。一旦消息在队列中,监听该队列的消费者可能会收到该消息(取决于附加的消费者数量等)。

根据我的经验,处理此问题的最佳方法是更改​​您的 RMQ 拓扑和应用程序设计,以便这不会成为问题(可能不可能),或者让您的应用程序知道它是哪条消息发送,并忽略它发送的任何内容。

我认为第一个选项更好(确保良好的应用程序/拓扑设计不会发生这种情况),但第二个选项通常更容易...

为此,您可以在消息中添加自定义 属性,例如 "publisher-id" 或类似内容。让您的消费者代码检查以确保消息的 publisher-id 匹配它自己的 publisher-id。如果确实匹配,则不再执行任何操作即可确认消息。如果不匹配,则正常处理消息。

您可以为每个组件分配单独的路由键(例如 app1app2app3、...)并为每个组件订阅除其自身之外的所有其他路由键.

因此,当 App 1 发送一条消息时,它将使用路由密钥 app1 发送,但它仅订阅了 app2app3、....