面试题答案
一键面试生产者方面
- 发送速度过快:生产者以极高频率向MQ发送消息,而消费者处理速度跟不上,导致消息在MQ中堆积。例如在高并发业务场景下,大量请求同时触发消息发送,每秒产生数千条甚至更多消息,消费者无法及时消费。
- 生产者异常重试:若生产者在消息发送过程中遇到网络抖动等异常情况,进行过度重试,可能短时间内产生大量重复消息,加重MQ负担,引发堆积。比如网络偶尔波动,生产者每次发送失败都立即重试,短时间内同一消息重试数十次。
消费者方面
- 消费能力不足:
- 消费者数量过少:当消费者实例数量太少,面对大量消息时,无法及时处理。比如系统预估每日消息量百万级别,却仅部署了1 - 2个消费者实例。
- 消费逻辑复杂:如果消费消息时,涉及复杂的业务逻辑,如大量数据库读写、复杂计算等,会导致单个消息处理时间过长,造成消息堆积。例如消费消息时需要进行多层嵌套的数据库查询与复杂数据处理,一条消息处理时间达到秒级。
- 消费端故障:消费者应用出现如内存溢出、程序崩溃等故障,会导致一段时间内无法消费消息,进而造成消息堆积。
- 负载均衡问题:在集群消费模式下,若负载均衡算法不合理,可能导致部分消费者实例负载过重,而部分实例空闲,从而影响整体消费效率,引发堆积。例如RocketMQ默认的平均分配算法在消费者处理能力不均时,可能使处理能力弱的实例分配过多消息。
MQ自身配置方面
- 队列数量配置不合理:
- 队列过少:过少的队列数会限制消息并行处理能力,当消息量较大时易出现瓶颈,导致消息堆积。例如在高并发场景下,仅配置了少量队列,消息只能串行处理。
- 队列过多:过多队列会增加系统管理开销,同时可能导致资源分散,影响整体性能,间接引发消息堆积。
- 存储资源不足:MQ服务器的磁盘空间、内存等存储资源不足时,无法正常存储新消息,可能导致消息发送失败或堆积。比如磁盘空间已满,新消息无法落盘存储。
- 刷盘策略:若采用同步刷盘策略,虽然保证了数据可靠性,但会降低消息写入性能。在高并发写入场景下,可能因刷盘速度慢导致消息堆积。而异步刷盘虽然写入性能高,但存在数据丢失风险,如果异步刷盘配置不当,也可能引发问题。
- 流控机制:RocketMQ的流控机制若设置不合理,如限制的TPS过低,可能会阻止生产者发送消息,使消息在生产者端堆积;或者对消费者的流控设置过严,限制了消费速度,导致MQ端消息堆积。