RabbitMQ:在没有连接消费者时丢弃消息



我正在尝试在一个只有一个生产者和一个消费者的模型中设置 RabbitMQ,并且生产者发送的消息仅在消费者连接时才传递给消费者,但如果消费者不存在,则丢弃。

基本上,我希望队列在没有消费者连接到它时丢弃它收到的所有消息。

另一个约束是队列必须在 RabbitMQ 服务器端声明,并且不能由使用者或生产者显式创建。

这可能吗?

我已经看了一些东西,但我似乎无法让它工作:

持久
  1. 与非持久不起作用,因为它仅在代理重新启动时才有用。我需要相同的效果,但在连接上。
  2. 在队列上将auto_delete设置为 true 意味着我的客户端永远无法再次连接到此队列。
  3. x-message-ttlmax-length使得即使连接了消费者,也可能丢失消息。
  4. 看过主题交换,但据我所知,这些只影响基于消息内容在交换和队列之间的消息路由,而不能考虑队列是否连接了消费者。

我正在寻找的效果类似于断开连接时auto_delete,连接时auto_create。rabbitmq 中是否有一种机制可以让我这样做?

经过更多的研究,我发现我的问题中关于x-message-ttl的一个假设是错误的。我忽略了 RabbitMQ 文档中的一句话:

将 TTL 设置为 0 会导致消息在到达队列时过期,除非它们可以立即传递给使用者

https://www.rabbitmq.com/ttl.html

事实证明,最简单的解决方案是将x-message-ttl设置为在我的队列中0

你不能直接这样做,但有一个机制很难实现。

您必须启用事件交换插件。这是一个交换,您的服务器应用程序可以在其中连接,并将接收 RabbitMQ 的内部事件。您会对 consumer.create 和 consumer.delete 事件感兴趣。

收到这些事件后,您可以触发操作(创建或删除所需的队列(。更多信息请点击此处:https://www.rabbitmq.com/event-exchange.html

希望这有帮助。

如果您的消费者被允许在代理上启动/停止期间动态绑定/取消绑定队列,那么应该可以通过这种方式(例如,队列是预先设置的,消费者在启动期间将队列绑定到它想要从中接收消息的交易所(

最新更新