定时任务实现自动补偿队列踩坑实录

  • 踩坑背景:目前的架构是mq消费失败会丢进补偿队列,补偿队列没有消费者,采用定时任务轮询去取补偿队列中的消息,while循环会一直取补偿队列中的消息,除非补偿队列为空时,才会终止循环。
    如下图所示
    在这里插入图片描述
  • 线上故障状况:大量锁等待,锁超时,连接mq超时

分析代码后发现,
那…如果补偿队列有源源不断的大批量消息,那么会存在三个问题。
1、while循环一直不结束。
2、若消费补偿队列时失败,则会存放在errorList,若有大批量的消息失败,会导致有这个list会无限增大,最严重时甚至OOM
3、确认时采取了一次确认,若存在上百万上千万的补偿消息同时确认会导致占用时间增长,mq处理不过来,甚至阻塞,网络带宽被打满的情况

  • 事后复现

当rabbitmq集群由5个节点组成的时候,如果2个或2个或以上节点在一定时间内有网络或连接阻塞问题,会导致集群出现不可恢复的脑裂问题。
事后进行了复现,在出现大量消息快速消费且批量ack时会出现sync节点信息同步情况,如果同步时间过长会导致同步失败以致于节点失联。

mq集群在满足以下特定条件后,出现卡死现象,不能正常生产和消费消息:
1.mq集群最大使用内存阈值设置超过60%
2.mq集群中内存中有大量消息,占用较多内存,接近设置阈值
3.mq集群处在频繁生产和消费消息的场景下,大块内存被快速交换使用
4.mq集群版本为3.5,较低,且运行在centos6系统

  • 代码优化
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值