跳至主内容

RabbitMQ 3.3 中的消费者偏差

·3 分钟阅读
Simon MacMullen

我先警告您:这又是一篇关于 RabbitMQ 3.3 中性能相关更改的长篇博文。您还在吗?很好。

所以,在 上一篇帖子中,我提到了“一个我将在未来的博文中讨论的新功能”。那个功能就是消费者偏差。

RabbitMQ 中的每个队列都是一个 Erlang 进程,与所有 Erlang 进程一样,它会响应发送给它的消息。这些消息可能代表发布到队列的 AMQP 消息,或传入的 basic.get 请求,或告诉队列消费者网络连接不再繁忙,因此可以再次接收消息的消息,等等。它一直都是消息。

当队列不繁忙时,它会像消息进来一样响应。但随着消息速率的增加,队列开始更努力地工作,我们会遇到队列占用所有可用 CPU 周期的状态。此时,入站消息开始排队等待队列处理!流控制可以防止它们无限堆积 - 但它们堆积的事实可能会对队列产生一些影响。

一些入站消息有助于队列缩小(“该消费者可以再次接收消息”、“我想执行 basic.get”),而一些消息则会导致队列增长(“我想发布一条新消息”)。因此,当队列满负荷运行时,我们希望优先处理有助于队列缩小的消息,以便队列倾向于保持为空而不是无限增长。

我们在 RabbitMQ 1.7.0 中添加了这种偏见。

那么我为什么现在要谈论它呢?那已经是五年前了!

不幸的是,事实证明,无条件地优先清空队列可能会产生不良的副作用 - 在某些情况下,队列可能花费 100% 的时间将消息传递给消费者,事实上我们收到了一些用户的报告,他们看到了这种情况 - 所有消费者都离线了,队列会堆积到巨大的规模,然后消费者又回来,队列在完全清空之前拒绝接受任何发布。那不是一个非常有用的队列。

因此,我们在 RabbitMQ 2.8.3 中删除了这种偏见,回到了 CPU 密集型队列可能倾向于无限增长的情况。

但我们仍然希望做得更好。在 3.3.0 中,我们终于做到了。

现在,队列不再无条件地倾向于缩小,而是能够持续监控其大小的变化速率,并且在繁忙时会优先处理有助于缩小的消息 - 但仅限于它们传递的消息数量比接受的消息数量多 10% 之前。因此,CPU 密集型队列仍然会接受消息,但随着时间的推移,它们会倾向于缩小而不是变大。终于松了口气!

© . This site is unofficial and not affiliated with VMware.