面试官:RocketMQ 消息积压了,增 加消费者有用吗?
我:这个要看具体的场景,不同的场景下情况是不一样的。
面试官:可以详细说一下吗?
我:如果消费者的数量小于 MessageQueue 的数量,增加消费者可以加快消 息消费速度,减少消 息积压。比如一个 Topic 有 4 个 MessageQueue,2 个消费者进行消费,如果增加一个消费者,明细可以加快拉取消息的频率。如下图:
如果消费者的数量大于等于 MessageQueue 的数量,增加消费者是没有用的。比如一个 Topic 有 4 个 MessageQueue,并且有 4 个消费者进行消费。如下图
面试官:你说的第一种情况,增加消费者一定能加快消 息 消 费的速度吗?
我:这...,一般情况下是可以的。
面试官:有特殊的情况吗?
我:当然有。消费者消息拉取的速度也取决于本地消息的消费速度,如果本地消息消费的慢,就会延迟一段时间后再去拉取。
面试官:在什么情况下消费者会延迟一段时间后再去拉取呢?
我:消费者拉取的消息存在 ProcessQueue,消费者是有流量控制的,如果出现下面三种情况,就不会主动去拉取:
-
ProcessQueue 保存的消息数量超过阈值(默认 1000,可以配置);
-
ProcessQueue 保存的消息大小超过阈值(默认 100M,可以配置);
-
对于非顺序消费的场景,ProcessQueue 中保存的最后一条和第一条消息偏移量之差超过阈值(默认 2000,可以配置)。
这部分源码请参考类:org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl。
面试官:还有其他情况吗?
我:对于顺序消费的场景,ProcessQueue 加锁失败,也会延迟拉取,这个延迟时间是 3s。
面试官:消费者延迟拉取消息,一般可能是什么原因导致的呢?<