RabbitMQ 双机系统偶尔丢失消息问题排查

实话说起来,这个问题,实际是一个非常低级的错误导致的,算不得什么高深的技术问题。但是在排查的过程中,却是费了好大的功夫,死了不少脑细胞。所以也值得记录一下,算作给大家提个醒,或许可以帮大家节省点时间。

情况是这样的,我们的一个项目,采用双机热备的模式部署了一套应用系统,这个应用系统和上层的业务系统之间通过RabbitMQ进行消息交互。上层业务系统发布业务数据,应用系统订阅业务数据并处理。由于是双机热备模式,所以程序上还做了处理,只有主机负责订阅业务数据,备机不会进行订阅。

在开发测试阶段发现,应用系统偶尔会出现收不到上层业务系统发布的业务数据的情况。经过检查,RabbitMQ的队列中没有消息堆积,这说明要么上层业务系统没有将消息放入队列中,要么订阅过程中发生了消息丢失。

根据上面的判断,第一反应是网络问题,于是对网络进行了检测,排除了网络质量的问题。然后怀疑是我们业务系统没有正确处理订阅消息导致的,于是又在主机上进行了网络抓包,发现确实没有收到该订阅的消息。 既然网络没有问题,又确实没有收到消息,所以进一步怀疑是上层系统的问题,结果上层系统排查了半天,确认消息确实发布到了队列中。

于是问题就来了,既然消息进入了队列,队列里消息也被消费了,但为啥业务系统收不到? 于是大家一顿头脑风暴,最后突然间想到,双机系统出了问题? 该被主机处理的消息,被备机订阅到了?导致主机消息丢失?

按照这个思路一查,发现确实是这样的。原本不应该订阅和消息消息的备机居然收到了消息。根据设计这不应该发生。仔细一查,原来是程序出了BUG.

最后总结下来,虽然是一个低级的程序bug,但是排查过程中,浪费了太多的时间,主要是大家都没有考虑到双机系统会出现备机消费消息的可能性。 这个问题以后在双机或者多机系统中,应该最为一个排查项来考虑,以免走弯路。

相关推荐
灯澜忆梦16 小时前
【RabbitMQ #3】 | Go 客户端 + SpringAMQP
分布式·golang·rabbitmq
Q26433650231 天前
【有源码】基于Spark的电商客户细分与盈利洞察分析系统-面向精准营销的电商客户细分模型构建与盈利能力可视化研究
大数据·hadoop·分布式·数据挖掘·数据分析·spark·毕业设计
晴空蓝天1 天前
RabbitMQ 消息可靠投递:confirm 确认 + 消费重试 + 死信队列
rabbitmq
驭渊的小故事1 天前
RabbitMQ 环境配置和 DirectRabbitConfig 的 SpringBoot 4.0.X 版本
spring boot·rabbitmq·java-rabbitmq
新思维软件1 天前
基于无线传输的地衡系统:三节点 LoRa 组网与 MQTT 上云的分布式称重方案
分布式·stm32·单片机·嵌入式硬件·物联网·物联网开发
俊哥大数据1 天前
Flink1.20.3 实时消费 Kafka 数据并解析入湖 Paimon1.4.2 全流程实战
分布式·flink·kafka·数据湖·paimon
宸津-代码粉碎机1 天前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
程序猿乐锅1 天前
【黑马点评 | 第八篇】Redisson分布式锁
java·数据库·spring boot·redis·分布式·spring·缓存
ly76891 天前
RabbitMQ 消费确认与预取:manual ack、reject、nack 与 QoS 的取舍
rabbitmq·死信队列·消息可靠性·消费确认·qos 预取
灯澜忆梦1 天前
【RabbitMQ #7】 | 消息转换器
分布式·rabbitmq·ruby