我一直在研究一个使用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
非常感谢
答案 0 :(得分:6)
我相信你问题的答案是RabbitMQ中的强制标志:
此标志告诉服务器如果无法将消息路由到队列,如何做出反应。具体来说,如果设置了必需,并且在运行绑定之后将消息放在零队列上,则将消息返回给发送方(使用basic.return)。如果在相同的情况下没有设置强制,服务器将默默地丢弃该消息。
这基本上意味着,将消息排入队列,如果无法路由,则将其返回给我。请查看规范中的basic_publish以将其打开。
答案 1 :(得分:0)
可以使用死信交换来存储尚未消费的消息http://www.rabbitmq.com/dlx.html
我不确定这正是您所寻找的,但可以用于解决方案。