broker 日志报 TooManyConnections,netstat 上 9092 的 ESTABLISHED 有 6120 条,应用侧每分钟创建两百多个 Producer,用完没有 close。日志里能对上时间点,这种反而好排。

Producer 是长连接且内部带缓冲,每次 new 都新建 TCP 和元数据连接,不 close 就靠 GC 回收。broker 的 max.connections 默认 10000,几台实例一起打就满。这一点先确认清楚,后面就不用反复试。

# 单例
private static final KafkaProducer<String,String> P = new KafkaProducer<>(props);
ss -antp | grep 9092 | wc -l
# server.properties
max.connections=20000

「Kafka 连接数打满」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

处理上按这个顺序:Producer 改成单例 整个进程共用一个;发送完调用 flush 但不要每次 close 由容器生命周期统一关闭;确认 connections.max.idle.ms 让空闲连接能回收;临时调大 max.connections 只作为缓冲 不要长期依赖。

结果对不对很好判断,ESTABLISHED 连接数稳定在 300 以内 broker 不再出现 TooManyConnections。

作者 9823189