我们从kafka获取数据,如下图,有两步,第一步是从dmq获取出来放到一个队列里;第二步是我们消费线程从队列里获取内容。
对第一步,业务作为dmq客户端,启动N个连接去连接dmq,连接数由配置项mq.consumer.connections指定,一般模块都没配置(目前小组内框架设置的默认值是2)
对第二步,消费线程数是由配置项 consumer.thread.num 决定(出现问题时为10)
巡检时发现现网积压了2500万消息,每个消息体大小为1K。在现网随时jstack都可以看到消费线程是8-10个在处理消息,说明线程已经跑满了;
每个线程处理消息时间为2-3ms,1秒可以处理300多个消息,10个线程上限是3000tps,2个节点大约可以处理6-7000,(从业务日志可以看到当时一秒可以处理3400)但是当时生产效率大约9000/s。于是修改现网配置中消费者线程数为50,重启后问题修复。
重启后观察日志,1秒可以处理5000,jstack查看线程可以发现50个线程在处理的有10-30个,也说明之前的线程太少,积压问题解决。
下一步,继续优化从kafka获取的线程数,让分区数 = 节点数*客户端连接数