5

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

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

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

所以我的问题是:

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

我试过的:

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

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

  • 有一个额外的队列来进行带外控制(因为所有订阅者都由同一个进程运行)。这种方法对我来说并不理想。

附加信息

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

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

  • 鼠兔版本是 0.9.5

  • rabbitmq 版本是 2.8

非常感谢

4

2 回答 2

8

我相信您的问题的答案是 RabbitMQ 中的 Mandatory 标志:

如果消息无法路由到队列,该标志告诉服务器如何反应。具体来说,如果设置了强制并且在运行绑定之后,消息被放置在零队列中,那么消息将返回给发送者(使用 basic.return)。如果在相同情况下未设置强制,服务器将静默丢弃该消息。

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

于 2012-09-10T13:22:23.813 回答
0

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

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

于 2012-09-10T11:03:47.670 回答