用同样稀疏的消息到达节奏(每2毫秒一条)真实对比linger.ms=0和linger.ms=20,从producer内部统计里读出网络请求次数的真实变化,看这两个参数具体怎么配合触发批量发送。
命令 · python p = Producer({"bootstrap.servers": BS, "linger.ms": 0, "batch.size": 65536}) for i in range(2000): p.produce(TOPIC, value=f"batchtune-{i}".encode()) p.poll(0) time.sleep(0.002) # 真实模拟消息不是一下子涌来,而是每2毫秒来一条
batch.size真实是"这一批凑够多少字节就立刻发走",linger.ms真实是"哪怕还没凑够字节,等了这么久也要发走"——两者真实谁先满足谁触发发送。当消息真实以2毫秒一条的节奏慢慢到达,65536字节的batch.size几乎不可能被真实的消息量填满,这时候真正起作用的其实是linger.ms。
真实耗时: 5.09s, 真实发送的网络请求数(tx): 1973, 真实消息总数: 2000 真实平均每次网络请求携带的消息数: 1.01
2000条消息真实发了1973次网络请求,平均每次请求真实只带了1.01条消息——linger.ms=0意味着Producer一旦有消息在手上,不等待任何时间,立刻真实把它发出去,哪怕这一条消息离batch.size还差得远。每一条消息真实都单独占用了一次完整的网络往返。
真实耗时: 5.03s, 真实发送的网络请求数(tx): 246, 真实消息总数: 2000 真实平均每次网络请求携带的消息数: 8.13
每一步都是本文上面用同样到达节奏跑出来的原始统计数据。