有个需求,需要从其他系统全量同步供应商数据(大概有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-06-28 16:37:03 发布