【问题标题】:How to set per-queue memory limits for RabbitMQ?如何为 RabbitMQ 设置每个队列的内存限制?
【发布时间】:2015-07-30 14:58:47
【问题描述】:

我有 3 个使用 RabbitMQ 的应用程序 A、B 和 C,其中我有队列 Q1 和 Q2。

  1. 应用程序 A 在 Q1 中发布消息。

  2. 应用程序 B 使用来自 Q1 的消息,进行一些处理,并在 Q2 中发布其他消息。 B 仅在 Q2 成功发布消息后才确认来自 Q1 的消息。

  3. 应用程序 C 使用来自 Q2 的消息,进行一些处理并将某些内容写入数据库。

如果应用 A 发布的速度快于 B 的消耗速度,它最终会填满 RabbitMQ 服务器的内存或磁盘,will block any clients that try to publish messages

B 在确认来自 Q1 的消息之前被阻止发布到 Q2,从而导致死锁。

如果我可以限制每个队列而不是整个 RabbitMQ 的内存和磁盘使用量,我认为这可以解决。 有没有办法做到这一点,或者其他方式来解决我的问题?

如果需要,我可以切换到另一个支持此类功能的消息代理。

【问题讨论】:

    标签: rabbitmq message-queue


    【解决方案1】:

    不,设置每个队列的磁盘或内存限制不是在 RabbitMQ 中可以完成的(至少现在是这样)。

    如果消息不会丢失并且是关键任务,则让应用程序 B 以与 A 相同或更快的速度进行消费,例如,通过增加消费者数量可能是解决方案。

    另一种方法是通过Per-Queue Message TTLQueue Length Limit 丢弃额外消息。

    当然,该消息可以是 dead-lettered 用于警报通知和/或备份。

    您还可以不时检查队列长度并进行一些启发式方法来监控并关联您的工作流程(注意,queue.declare 将返回当前队列中的消息编号,但此 AMQP 方法本身是幂等的)。

    【讨论】:

    • 死信不会使用磁盘中的相同空间吗?
    • 肯定会,我们的想法是从那里获取消息只是为了报警,比如说你也可以在死信消息进入的队列上将长度限制设置为 1,所以只有一条消息会留在那里警报。这有点棘手,但通过这种方式,您不会一直跟踪原始队列大小,而且实现起来很简单。
    • 队列还有一个“x-max-length-bytes”设置rabbitmq.com/maxlength.html
    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2020-04-30
    • 2011-08-10
    • 2020-12-12
    • 2022-10-18
    • 1970-01-01
    相关资源
    最近更新 更多