丢弃没有人正在收听的 rabbitmq 消息

Discarding rabbitmq messages no one is listening to

我是 rabbitmq 消息传递的新手,如果这个问题很愚蠢或者我的设置完全是梨形的,我深表歉意。

我使用 rabbitmq 的设置正在从某些探测器发送消息。每个探测器都有一个唯一的名称。然后我有一个中央服务器,我在其中处理数据——如果有需要的话。

我使用与探测名称相对应的直接交换和路由密钥。

我声明我的消费者(服务器)如​​下(这或多或少来自rabbitmq教程):

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.exchange_declare(exchange="foo", type="direct")
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue

如果在某个时候我对探测器报告的内容感兴趣,我会发布

channel.queue_bind(exchange="foo", queue=queue_name, routing_key="XXX")

其中 XXX 是探测器的名称。

我在调查中的发布者声明如下:

connection = pika.BlockingConnection(pika.ConnectionParameters(host="foo.bar.com"))
channel = connection.channel()
channel.exchange_declare(exchange="foo", type="direct")

当我发送消息时,我使用

channel.basic_publish(exchange="foo", routing_key="XXX", body=data)

其中 XXX 是探测器的名称。

一切正常。但是我该如何做到这一点,以便立即丢弃没有人正在收听的路由密钥消息?现在,如果我的消费者停止监听路由键或根本不监听 运行,探测器发送的消息就会开始堆积。当我启动我的消费者或让它听一个路由键是一段时间没有听过时,我可能有数万条消息积压在那里。这不是我需要的,积压势必会导致某处资源耗尽。

有没有一种方法可以修改此设置,以便在消息到达交换器时如果没有人在收听它们,消息将被丢弃而不是排队?我假设有办法,但 Google 和 pika 文档没有帮助。

提前致谢。

But how do I make it so that messages to routing keys that no one is listening to get discarded immediately?

默认情况下,Rabbitmq 已实现 this.You 只需要确保没有绑定到该路由键的队列。

Now if my consumer stops listening to a routing key or is not running at all, messages sent by probes start piling up

如果该路由键没有队列,所有消息都将被丢弃。

Is there a way to modify this so that messages get discarded instead of queued if there is no one listening to them when they arrive at the exchange?

Rabbitmq 默认行为本身支持这个(对于直接交换)

浏览 https://www.rabbitmq.com/tutorials/tutorial-four-python.html

的页面