项目中引入MQ可能存在的一些问题及对应的解决思路

RabbitMQ消息堆积如何解决?

  1. 首先我们分析一下堆积原因
    >消息的生产者生产速度太快,快到消费消息的速度,远远赶不及生产消息的速递
    >消费者的业务处理逻辑时间过长/消费者挂了
  2. 然后我们想想怎么解决
    >既然我们提前已经想到了可能有这些问题,那我们就先以预防为主
    >消费者太慢的话,我们就优化消费者的处理逻辑,可以使用JDK中的队列去缓存,然后多线程去处理
    >默认情况下MQ是单线程消费的,我们可以开启并发消费,如何开启?问度老师
  3. 项目已经上线,并且已经出现消息堆积?
    >特殊情况下如果消息不是重要的消息,且不是必须得话,个人任务可以直接删除
    >如果是因为消费者挂掉的话,紧急修复消费者,并让其重新上线.如果公司实力允许的话增加消费者数量,以求快速消费掉堆积的数据
    >如果是生产消息的速度消费消息的速度 <不一致> ,并且已经导致消息堆积.增加消费者吧.

RabbitMQ如何保证消息消费的幂等性?
产生重复消费消息的原因主要有两个

  1. 生产端: 消息生产者端在开启confirm模式下,生产者已经把消息发送给了Broker,单Broker回复Ack确认时网络中断,生产者没收到,误认为没有成功投递,然后生产者重新发送,导致消息重复消费
  2. 消费端: 消费者端,接收到消息,并处理完后,给Borker回复Ack时网络中断,Broker没有收到确认消息,然后与MQ会吧这个消息重新给消费者发送一次,这样也会导致消息的重复消费

解决方案:

  1. 业务幂等
  2. 为每个消息分配一个全局唯一的ID,消费者端每次拿到消息之后,拿这个ID去查重表(也可以使用redis的setnx命令)中去比较,

RabbitMQ如何保证消息不丢失

  • 生产者端解决消息丢失
    1. 开启事务(同步的,影响性能,不推荐)
    2. 开启confirm模式(异步,推荐)
  • RabbitMQ自己开启持久化
  • 消费者端解决消息丢失
    1. 把自动Ack,改为手动Ack
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值