有个需求,需要从其他系统全量同步供应商数据(大概有40万的信息,每个信息有大量的数据,需要保存到多个表中),第一次同步发下触发了GC,同时发现consumer从mq断开。
然后开始排查,第一步怀疑是oom,创建对象过多,cup高负荷运行,导致内存oom,
针对这个问题,使用了克隆clone方式,实体类实现

添加克隆后,启动全量同步,发现还是oom,然后又排查是否还有其他大对象生成,检查代码后,发现每个消息都会生成一个ArrayList,而且还没有默认容量,这样会导致扩容,扩容会导致消化大量的内存。解决方式,默认容量,给了个500
ArrayList<>(500),然后同步,发现还是断开了,这时候没有oom了,也就是说解决了内存问题,有出现了新问题,为什么consumer和断开。
经常一系列的排查,发现最有可能出现的是consumer消息挤压导致的,大量的消息来不及消费,而consumer又不停从queue中获取新的消息,导致挤压,最后断开连接。
发现问题后,设置consumer每次去获取1条消息,等这条消息消费完后,ack后才去获取吓一条消息

最后启动全量,
这样确保了全量的同步成功
rabbitMq 全量同步数据 出现consumer和mq断开
最新推荐文章于 2024-07-25 20:31:25 发布
本文详述了一次处理40万条供应商数据同步至多个表的过程中遇到的问题及解决方案。首先,由于对象创建过多引发GC和consumer断开,尝试通过对象克隆减少内存消耗,但问题依旧存在。接着发现ArrayList扩容导致内存压力,调整默认容量为500缓解了OOM问题。然而,consumer仍会断开,排查后确定是消息挤压导致,于是调整consumer每次只取一条消息并确认消费后再取下一条,最终成功实现全量同步。
5045

被折叠的 条评论
为什么被折叠?



