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

时间:2012-09-10 10:15:40

标签: python rabbitmq pika

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

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

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

所以我的问题是:

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

我尝试了什么:

  • 检查pika.basic_publish的返回值。它始终返回None

  • 当我们尝试发布不存在的绑定时,检查是否存在异常。没有。

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

其他信息

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

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

  • pika版本为0.9.5

  • rabbitmq版本是2.8

非常感谢

2 个答案:

答案 0 :(得分:6)

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

  

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

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

答案 1 :(得分:0)

可以使用死信交换来存储尚未消费的消息http://www.rabbitmq.com/dlx.html

我不确定这正是您所寻找的,但可以用于解决方案。