我正在尝试在一个只有一个生产者和一个消费者的模型中设置 RabbitMQ,并且生产者发送的消息仅在消费者连接时才传递给消费者,但如果消费者不存在,则丢弃。
基本上,我希望队列在没有消费者连接到它时丢弃它收到的所有消息。
另一个约束是队列必须在 RabbitMQ 服务器端声明,并且不能由使用者或生产者显式创建。
这可能吗?
我已经看了一些东西,但我似乎无法让它工作:
持久- 与非持久不起作用,因为它仅在代理重新启动时才有用。我需要相同的效果,但在连接上。
- 在队列上将
auto_delete
设置为 true 意味着我的客户端永远无法再次连接到此队列。 x-message-ttl
和max-length
使得即使连接了消费者,也可能丢失消息。
我- 看过主题交换,但据我所知,这些只影响基于消息内容在交换和队列之间的消息路由,而不能考虑队列是否连接了消费者。
我正在寻找的效果类似于断开连接时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
希望这有帮助。
如果您的消费者被允许在代理上启动/停止期间动态绑定/取消绑定队列,那么应该可以通过这种方式(例如,队列是预先设置的,消费者在启动期间将队列绑定到它想要从中接收消息的交易所(