一、消息丢失
1、 生产者丢消息
场景:
生产者在将数据发送到MQ的时候,可能由于网络等原因造成消息投递失败。
解决方法:
当MQ接收到消息之后,给生产者发送确认信息,若生产者等待MQ的确认信息超时,则再次发送消息。
2、MQ自身丢消息
场景:
MQ接受到消息后,还未将消息转发给消费者时,MQ服务宕机等原因造成消息丢失。
解决方法:
消息持久化保存。
3、消费者丢消息
场景:
消费者刚接收到消息还没处理完成,消费者服务宕机等原因造成消息丢失。
解决方法:
当消费者消费完消息后,给MQ发送确认信息,若MQ等待消费者的确认信息超时,则再次发送消息。
二、重复消费
场景:
- MQ接收到消息后,因为网络等原因,确认信息发送延迟,此时生产者等待超时,再次发送了消息。
- 消费者消费完消息后,因为网络等原因,确认信息发送延迟,此时MQ等待超时,再次发送了消息。
解决方案:
给每个消息生成一个唯一id,MQ和消费者每次处理消息时,根据id判断是否已处理过该消息。
三、顺序消费
消息乱序的原因:
消息生产:多个生产者或一个生产者内多个线程一起生产消息;
消息消费:多个消费者或一个消费者内多个线程一起消费消息。
解决方案:
-
全局顺序:所有消息都按照顺序生产、消费
只有一个队列;一个生产者,单线程生产消息;一个消费者,单线程消费消息。 -
部分顺序:同一类的消息按照顺序生产、消费
同一类的消息进入一个队列;
消息生产:
(1)生产者,单线程生产一类消息
(2)生产者,每个线程生产一类消息
消息消费:
(1)消费者,单线程消费一类消息
(2)消费者,每个线程消费一类消息