Kevin开发日记(一):MQ与数据库的消费问题
1.背景
1.现有MQ,负责传递消息至Java模块
2.现有Java模块,负责接收来自MQ的消息并持久化至数据库
2.问题
MQ的消费情况非常慢,判断应该是Java模块存储部分出现问题。
(最令人疑惑的点出现了,五一前Java模块持久化速度正常,仍能以5000+条/s速率消费,五一过后一来,直接0.2/s,这个消费速度差异的原因还是没有找到)
3.原因
1.打印了持久化数据的耗时,发现确实很慢,但是又都是插入操作,即使再慢也不能插一两条数据耗时个10s+吧(疑惑脸)
4.措施
1.修改了RabbitMQ的listener的并发数量,由5改为了1,也就是从五个消费者变为了一个消费者。考虑是不是多个消费者的并发插入操作与数据库事务存在关联影响
结果:没啥作用
2.采用异步模式操作数据库,在方法上打了@Async标签
结果:效果显著,RabbitMQ没有再出现堆积的情况
疑惑:这也是非常令我疑惑的一点。原流程就是从RabbitMQ拿到消息,然后转换消息格式后就存放至数据库,我没有太明白异步和同步在此的效能区别在哪里。看来需要看看@Async标签的具体作用。
3.配置线程池
结果:未有结果。因为另外一些数据量较多的处理单元采用了Redis作为中间缓存,最开始是与其他处理单元共用了一个线程池,可能出现线程争抢的情况。然后又由于在存储处加上了@Async异步,无法观察单一变量效果。
4.批量插入
结果:效果不错。将原来的单条插入换成了saveBatch,性能有一定提升。