如何使用rabbitmq路由功能知道消息是否已发布到队列

Fre*_*red 4 python rabbitmq pika

我一直在研究一个使用rabbitmq进行交流的项目.最近我们发现,如果我们使用兔子路由功能,它将具有很大的可扩展性.所以基本上我们将队列绑定到几个路由键并使用类型的交换direct.

它像发布/订阅一样工作.因此,可以将队列绑定和解除绑定到不同的事件,以便消费者/订阅者只接收他们感兴趣的消息.

当然,生产者/发布者现在使用绑定密钥(事件名称)将routing_key其传递给pika实现.但是,当它为不存在的绑定发布某些内容时,该消息将丢失,即当没有人绑定事件队列foo但是某些发布者调用时pika.basic_publish(..., routing_key='foo').

所以我的问题是:

是否可以知道消息是否实际发布在队列中?

我尝试过的:

  • 检查pika.basic_publish的返回值.它总是回归None.

  • 当我们尝试发布不存在的绑定时,请检查是否存在异常.空无一人.

  • 有一个额外的队列来进行带外控制(因为所有订户都由同一个进程运行).这种方法就像用火箭筒杀死苍蝇一样,我拒绝保留它.而且,我认为我应该为了实际尝试而拍摄自己.

附加信息

  • 由于我正在使用此路由功能,因此队列名称由rabbit生成.如果新方法必须命名队列本身,我没有任何问题.

  • 如果建议一种新的方法需要绑定到交换而不是队列,我想听听它们,但我宁愿避免使用它们,因为它们实际上不是AMQP,而是由rabbitmq实现的扩展.

  • 鼠兔版是0.9.5

  • rabbitmq版本是2.8

非常感谢

kzh*_*hen 7

我相信你的问题的答案是RabbitMQ中的强制标志:

此标志告诉服务器如果无法将消息路由到队列,如何做出反应.具体来说,如果设置了必需,并且在运行绑定后,消息被放置在零队列上,则消息将返回给发送方(使用basic.return).如果在相同的情况下没有设置强制,服务器将默默地丢弃该消息.

这基本上意味着,将消息排队,如果无法路由,则将其返回给我.请查看规范中的basic_publish以将其打开.