轻松解决kafka producer发送很慢的问题

使用场景:kafka发送producer为单实例(使用new kafkaProducer)并且使用同步发送,发送kafka使用线程池执行发送任务,任务队列大小为2000,kafka连接server端使用kerboeros认证。


当业务下发从nginx进入,两个tomcat节点进行发送kafka处理,1200TPS时会偶现几次处理时延很长,直接导致nginx504,第一时间打开debug日志,发现最长处理kafka发送时延也就1秒多,nginx配置超时时间为60s,怎么会导致nginx超时呢?


问题分析:
分析kafka日志发现,每次发送数据大部分时间在0-1ms,出现时延的情况时发现都是连续出现的,由于发送端只有一个producer实例,这样当一个message发送阻塞了,将会瞬间导致TPS急剧下降,正常情况下一个kafka实例在1秒内能够处理1000个发送请求,但出现1秒的时延将会导致1秒只能处理1个发送请求,这样会阻塞后面数据的处理,马上将线程池任务队列塞满,后面的nginx请求也就随之阻塞,当nginx在60s后没有收到任何相应就504的问题


问题原因:
由于producer是线程安全的,所以采用单实例,但一次发送阻塞(因为使用同步发送,每次发送都会等待结果,这个过程是同步的),将会影响到后续的数据处理。


修改策略:
将producer改为多实例,使用数组将多个实例缓存起来,每次使用producer是在数组轮询取出一个进行使用,修改之后连续长稳环境跑了24小时,打开日志发现发送kafka时延还是有少量100ms以上的长时延,但基本都在100ms-500ms之间,不算很长,并且当不会连续出现了,nginx也没有出现504这种情况了,说明多实例修改是有效果的。


如果上述修改依然没作用,那么请查看

KafkaSpoutConfig.builder("node01:9092,node02:9092,node03:9092", "test22");中的节点映射,即查看系统中的hosts文件,节点地址和节点名称映射是否唯一。

你可能感兴趣的:(大数据框架,Kafka)