如何通过.NET中的路由密钥接收RabbitMQ?

How to receive RabbitMQ by routing key in .NET?

我有一个名称为 QUEUE 的队列,交换类型为 topic。它有 2 条消息。一个带有路由键A,另一个B。有效负载对 atm 没有意义。

我需要 运行 2 个不同的应用程序(消费者)。我希望 app1 只接收带有路由密钥 A 的消息,而另一个只接收带有密钥 B 的消息。

我找不到解决方案 - 即使我 bing 只发送给 A,我仍然收到 2 条消息。如果我不能将消费者绑定到它,路由密钥有什么意义?

我该怎么做?

当我第一次开始使用 RabbitMQ 时,我 运行 遇到了同样的问题/困惑。我觉得很奇怪。

最后我意识到我在考虑the relationship between exchanges, queues and bindings,倒退。

消费者不会从交换器或路由密钥中消费。消费者从队列中消费。

这是消费者唯一应该知道的事情:他们消费的队列。

另一方面,消息发布者关心的是使用正确的路由密钥发布到正确的交换器,以便消息最终进入正确的队列。

要解决您的情况,您需要了解如何让应用程序 1 从仅接收来自队列 1 的消息的队列中消费。同样,应用程序 2 应该只接收来自队列 2 的消息。

路由键的作用是确保消息被发送到正确的队列。

例如,您可以定义如下拓扑:

| exchange   | queue    |  routing key (binding) |
|------------|----------|------------------------|
| some.ex    | queue-1  | key.a                  |
| some.ex    | queue-2  | key.b                  |

应用程序 1 只会使用来自 queue-1 的消息,应用程序 2 只会使用来自 queue-2 的消息。当您通过 some.ex exchange 发布消息时,您提供路由键和交换的绑定,例如 "key.a goes to queue-1" 和 "key.b goes to queue-2".

这是一个非常简单的配置示例,您可以使用它向正确的消费者发送正确的消息。有很多您想要的潜在配置。

不过,主要的一点是您的使用者必须能够处理发送到它从中读取的队列的任何消息。因此,您必须只将消费者可以处理的消息发送到消费者从中读取的队列。