最近同时发现 Kafka Broker 的 TCP 连接比较多,单台 broker 已经达到了10K+,认为太多的 TCP 连接会给 Broker 带来压力,要求平台开发进行解决。在进行简单的排查后发现有一类任务会启动很多 worker, 每个worker会启动一个 Kafka Prouder ,向某个topic 上报数据,基本情况如下:
-
worker 有 3000+
-
producer 发送总的 qps 300+
-
单条消息大小 100K
-
topic 有 16 个 partition,3 replica,每个 leader partition 分布在不同的 broker 上
综合上面的参数,直观上认为这种情况确实会对 broker 产生压力,原因如下:
-
produer 会向 broker 更新元数据,由于 producer 的实例比较多,发送的请求量会比较大
-
Kafka producer 会和每个 partition 的 leader,建立 TCP 连接,通过简单的计算,可知会产生 16*3000 = 48000 个 TCP 连接, 与单台 broker 建立的连接在 3000+
但仔细思考一下,事情其实并不简单,会涉及到很多知识。
关于元数据更新
Kafka prouder 更新元数据的默认间隔是 5 分钟,对应的配置项如下,折算下来更新元数据的 qps 也就3000/(5*60) = 10,并不会产生太大影响。
.define(METADATA_MAX_AGE_C