跳转至

消息队列在使用的时候可能会遇到哪些坑?

典型回答

在使用消息队列时,虽然它能有效解耦系统、削峰填谷、提升异步处理能力,但实际工程中也存在不少“坑”

1、丢消息

不管是哪种MQ,用了什么样的方案,都只能尽可能的保障消息不丢,但是都没办法彻底解决消息丢失的问题,在极限情况下,消息还是可能会丢的。

5_✅Kafka如何保证消息不丢失?

10_✅为什么Kafka没办法100%保证消息不丢失?

4_✅RocketMQ如何保证消息不丢失?

想要尽量确保消息的可靠性,可以用本地消息表或者事务消息:

29_✅如何基于MQ实现分布式事务

2、消息重复

在MQ的使用中,尤其是消费者端,最常见的问题就是消息重复了,这个问题发生的原因有很多:

1、发送者多发了

2、消息第一次处理失败,又重投了

都有可能导致消息重复,所以,这是一个必须要解决的问题,常见的方案就是实现消息的幂等消费。

7_✅RabbitMQ如何防止重复消费

3、消息堆积

相信很多人也都遇到过消息堆积的问题,这个问题也常见,因为MQ的主要功能就是削峰填谷,既然他做了削峰填谷了,那么他必然有消息堆积的能力,不然他怎么做削峰填谷呢?

所以,消息堆积很常见,遇到这个问题,有很多不同的解法,给大家一条解决的SOP:

7_✅RocketMQ消息堆积了怎么解决?

4、消息乱序

消息乱序指的是消息没有按照我们希望的顺序投递,这个也有很多原因,比如发送方就没有按照顺序发送,或者broker投递的时候就不是有序的,或者是消费者处理的时候因为网络延迟啥的就没有保障顺序。

解决方案也有的,要么是用顺序消息,要么就是自己实现排序

94_✅MQ出现消息乱序了如何解决?

5、消息延迟

这个其实不算啥问题,和消息堆积一样,消息延迟本来就是MQ的一个特性,是个feature,不是个bug,哈哈哈。

想要减少延迟,那么就提升消费速度吧,搞消费者组,用批量消费,或者多线程消费都可以,总之就是让他消费的更快。

6、重平衡

当消费者数量、topic数量等发生变化的时候,MQ会触发重平衡,这时候可能会带来重复消费、乱序、STW等问题。需要重视。

20_✅MQ的重平衡会带来哪些问题?

7_✅什么是Kafka的重平衡机制?