首页 文章

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

提问于
浏览
2

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

基本上我希望队列在没有消费者连接时删除它收到的所有消息 .

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

那可能吗?

我看了几件事,但我似乎无法使其发挥作用:

  • 持久与非持久不起作用,因为它仅在代理重新启动时有用 . 我需要相同的效果,但在连接上 .
    在队列上

  • 设置 auto_delete 为true意味着我的客户端永远不能再次连接到此队列 .

  • x-message-ttlmax-length 即使连接了消费者,也可能丢失消息 .

  • 我've looked at topic exchanges, but as far as I can tell, these only affect the routing of messages between the exchange and the queue based on the message content, and can' t考虑队列是否已连接消费者 .

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

3 回答

  • 0

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

    将TTL设置为0会导致消息在到达队列时过期,除非它们可以立即传递给消费者https://www.rabbitmq.com/ttl.html

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

  • 0

    你不能直接这样做,但有一种机制并不是很难实现 .

    您必须启用Event Exchange插件 . 这是您的服务器应用程序可以连接的交换,并将接收RabbitMQ的内部事件 . 您会对consumer.created和consumer.deleted事件感兴趣 .

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

    希望这可以帮助 .

  • 4

    如果允许您的使用者在代理的启动/停止期间动态绑定/取消绑定队列,则应该可以通过这种方式(例如,队列是预先设置的,并且消费者在启动期间将队列绑定到它想要从其接收消息的交换)

相关问题