RabbitMQ-ACK机制有哪些坑?
作者:程序员马丁
在线博客:https://open8gu.com
note
大话面试,技术同学面试必备的八股文小册,以精彩回答应对深度问题,助力你在面试中拿个offer。
回答话术
1. Prefetch Count 和 Unack
说到 RabbitMQ 消息确认机制,就会牵扯到两个参数:Prefetch Count 和 Unack。
- Prefetch Count 就是设置一个上限,告诉消费者一次性能处理多少消息。比如你设置为 10,那消费者就一次最多处理 10 条消息。
- Unack 指的是那些已经发给消费者,但还没得到确认的消息。这个机制的目的,主要是为了防止消费者一下子处理太多消息,导致处理不过来。所以,如果 Unack 的消息数量达到了你设置的 Prefetch Count,RabbitMQ 就会停止继续发送消息,直到有些消息被确认处理完毕。这样一来,就能既保证效率,又不会让消费者过载。
2. Unack 带来的消息积压问题
首先要说一下 Prefetch Count 的概念:RabbitMQ 在投递消息时,会为每条消息赋予一个唯一的 Delivery Tag 用于标识消息,消费者在 ACK 消息时,需要带上 Delivery Tag 以告知 RabbitMQ 已消费了哪条消息。
对每个消费者 Channel 而言,存在未 ACK 的消息会占用内存。如果积压太多未 ACK 消息,可能导致内存溢出等问题。所以 RabbitMQ 不能无限制向消费者推送消息,需要考虑消费者的处理能力,控制其未 ACK 消息的数量。
Prefetch Count 就是用于限制每个 Channel 未 ACK 的消息数量,它能有效保护消费者不会积压太多未处理消息。