公司需求是把项目中产生的数据,实时入库到 MySQL,这些数据分别属于不同的 table.
现在的方案是把产生的数据通过 tomcat -> RocketMQ 的一个 topic 中,然后启用一个 MQ 消费者组合并消息(如果不合并入库次数太多也会慢),然后 batch 入库,这个方案单表没有任何问题.
如果设计到多个表入库,因为 mq 消费是顺序读取 topic 中的消息,也就导致如果一个表需要入库的数据量大,那么入库时间就会长,这会导致整体消费变慢,从而导致实时表不实时的问题.
这就是我现在遇到的问题
- 入库 MySQL 的时间长,解决时间长的问题(这个我目前想不到解决办法)
- 如果解决不了入库时间长的问题,那么就让他不影响其他表入库
我自己想过解决方案,针对问题 2 的
方案 1
从一个消费者组 改为 按表名创建消费者组,但是可用性不高
按表名创建消费者组,使用过一段时间,因为表比较多,然后在一个 jvm(如果多个程序分别启动不同的消费者组也不好管理)中启动那么多消费者组,首先内存会占用很多(应该是每个消费者组都会缓存一定数量的消息),也就是内存的大小跟实时表的数量是等比上涨的.其次我查了一下说是消费者组数量也不是可以无限加的,目前我们是 110 多张表,也比较多了.考虑到之后还会加表,这个方案试行了一段时间就废掉了.
或者这个方案有没有优化空间?
方案 2
把入库时间长的表单独分一个消费者组,可用性比第一个还低
经过实践,不晓得哪个时间点,表里数据生产就会增多,所以这样也会导致可能突然就延迟了....很不可控
然后就是大家有什么思路么?万分感谢!