Routing 从RabbitMQ主题交换上的*-绑定中排除一个路由

Routing 从RabbitMQ主题交换上的*-绑定中排除一个路由,routing,rabbitmq,amqp,Routing,Rabbitmq,Amqp,给定RabbitMQ主题交换,例如消费者队列绑定如下的x1: "source": "x1", "vhost": "rabbit", "destination": "queue1", "destination_type": "queue", "routing_key": "A.*", "arguments": {} "source": "x1", "vhost": "rabbit", "destination": "queue2", "destination_type": "queue", "r

给定RabbitMQ
主题
交换,例如消费者队列绑定如下的
x1

"source": "x1",
"vhost": "rabbit",
"destination": "queue1",
"destination_type": "queue",
"routing_key": "A.*",
"arguments": {}
"source": "x1",
"vhost": "rabbit",
"destination": "queue2",
"destination_type": "queue",
"routing_key": "A.a",
"arguments": {}
现在我想将一些匹配
A.*
的消息路由到另一个队列。例如,
A.A
应进入
queue2
,而所有其他
A.*
仍应进入
queue1
queue2
的绑定如下所示:

"source": "x1",
"vhost": "rabbit",
"destination": "queue1",
"destination_type": "queue",
"routing_key": "A.*",
"arguments": {}
"source": "x1",
"vhost": "rabbit",
"destination": "queue2",
"destination_type": "queue",
"routing_key": "A.a",
"arguments": {}

queue1
的绑定应该如何排除
A.A
而保留其余部分?有可能吗?

好吧,你不能通过说“不是这个”或类似的话来制作路由密钥

为了实现您想要的,您可以尝试一些变通方法:将一个较大的预取计数设置为
队列2
使用者,并确保该使用者是第一个连接到代理的使用者(因为循环调度)。您必须弄清楚如何设置预取计数


当然,有很多原因导致这种方法不总是有效(如果消费者掉线,或者速度太慢等等),这不是
主题所做的,因此如果必须使用这种类型的交换,就不能从绑定中排除一条路由

你可能会发现:

其思想是能够在发布消息时指定路由模式。对于默认主题,只有在将队列绑定到交换时才接受交换模式


为了限制更改,我将坚持主题交换,并显式列出所有绑定,但这对未来来说是一个非常好的提示。