rabbitMQ插件实现延时队列引发的事故

本文讲述了在使用rabbitMQ延迟队列插件处理数据延迟查询时遇到的丢消息和内存占用问题。由于业务方主从分离模式,数据服务在消费MQ后查询到的数据可能不一致。为解决此问题,采用了延迟队列,但在上线后出现消息丢失和节点内存被占满的情况。经过排查,发现问题可能与插件本身有关,官方文档提示不适用于大量消息场景。最终,删除延迟队列并恢复原有逻辑,发现高峰期消息堆积。文章强调在使用插件前需深入理解使用场景,充分测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对,你没有看错,上一篇分享插件使用,现在分享插件引发的事故

大背景:

使用延迟队列的目的是要对一部分MQ数据做延迟查询,具体如下:

场景: 生产者(业务方)发送MQ消息,消费者(数据服务)接收到MQ之后,查询业务方数据,之后做计算并落库

存在问题:业务方使用主从分离模式,写主,读从。所以当消费者接收到MQ之后去查询业务方接口,业务方查询的其实是从库,这个时候数据很有可能就不一致,实际情况下看10%左右的概率会出现

从服务分层的角度讲,这个问题并不应该数据服务解决,因为数据服务就应该信任接口的数据,在当时的那个场景,那个时间点,查询到的就是这个数据

但是业务方才是老大,毕竟数据只是辅助,这里就体现了数据服务的弟位。

其实解决方案有接收到MQ之后延迟查询,做一个sleep这样的操作,但是当时觉得这样太粗暴,整体延时并不是一个好的办法,毕竟绝大部分情况下是不需要这样处理的
BTW:实际场景中这个消息队列是很多业务服务共用的

此时就想到了延迟队列,服务内部使用一个延迟队列,来完成对指定消息的延迟即:

原有队列 -> 数据服务 -> 延迟队列 ->数据服务

不需要延迟的可以在第一次被数据服务消费的时候就处理掉,其余的经过延迟队列之后再次由数据服务消费处理掉

实际上线之后平稳运行了一段时间之后出现了情况:

  1. 丢消息
  2. 某一个rabbitMQ 节点内存被占满,并且节点重启之后依瞬间又被占满

后续排查:

  1. 观察发现 RabbirMQ 的管理页面看到的监控并没有消息堆积
  2. 数据服务正常,不存在消费异常的情况
  3. 除了延迟队列之外的消息队列均正常

百思不得其解,但是基本可以确定是插件引发的,查询资料等之后,看到了插件的官方说明,发现其实一开始官方就有使用上的一些建议和限制,并且也查到了相关的issue

具体的官方说明如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值