RabbitMQ消息堆积如何解决?
- 首先我们分析一下堆积原因
>消息的生产者生产速度太快,快到消费消息的速度,远远赶不及生产消息的速递
>消费者的业务处理逻辑时间过长/消费者挂了 - 然后我们想想怎么解决
>既然我们提前已经想到了可能有这些问题,那我们就先以预防为主
>消费者太慢的话,我们就优化消费者的处理逻辑,可以使用JDK中的队列去缓存,然后多线程去处理
>默认情况下MQ是单线程消费的,我们可以开启并发消费,如何开启?问度老师 - 项目已经上线,并且已经出现消息堆积?
>特殊情况下如果消息不是重要的消息,且不是必须得话,个人任务可以直接删除
>如果是因为消费者挂掉的话,紧急修复消费者,并让其重新上线.如果公司实力允许的话增加消费者数量,以求快速消费掉堆积的数据
>如果是生产消息的速度和消费消息的速度 <不一致> ,并且已经导致消息堆积.增加消费者吧.
RabbitMQ如何保证消息消费的幂等性?
产生重复消费消息的原因主要有两个
- 生产端: 消息生产者端在开启confirm模式下,生产者已经把消息发送给了Broker,单Broker回复Ack确认时网络中断,生产者没收到,误认为没有成功投递,然后生产者重新发送,导致消息重复消费
- 消费端: 消费者端,接收到消息,并处理完后,给Borker回复Ack时网络中断,Broker没有收到确认消息,然后与MQ会吧这个消息重新给消费者发送一次,这样也会导致消息的重复消费
解决方案:
- 业务幂等
- 为每个消息分配一个全局唯一的ID,消费者端每次拿到消息之后,拿这个ID去查重表(也可以使用redis的setnx命令)中去比较,
RabbitMQ如何保证消息不丢失
- 生产者端解决消息丢失
1. 开启事务(同步的,影响性能,不推荐)
2. 开启confirm模式(异步,推荐) - RabbitMQ自己开启持久化
- 消费者端解决消息丢失
- 把自动Ack,改为手动Ack