将linger.ms保持为0的含义

时间:2018-03-16 07:06:35

标签: apache-kafka kafka-producer-api

我们正在使用kafka 0.10.2.1。该文档指定即使缓冲区未满,也可以发送缓冲区 -

  

默认情况下,即使缓冲区中有其他未使用的空间,也可以立即发送缓冲区。但是,如果要减少请求数,可以将linger.ms设置为大于0的值。

但是,它也说生产者将尝试批量请求,即使逗留时间设置为0毫秒 -

  

请注意,即使在linger.ms = 0的情况下,及时到达的记录通常也会一起批处理,因此在重负载下,无论延迟配置如何,都会发生批处理;但是,将此值设置为大于0的值可以在不受最大负载影响的情况下以较少的延迟为代价,从而减少更高效的请求。

直观地说,似乎任何类型的批处理都需要一些逗留时间,而实现0的逗留时间的唯一方法是使代理调用同步。显然,将逗留时间保持为0似乎不会像阻止发送呼叫那样损害性能,但似乎对性能有一些影响。有人可以澄清文档上面说的内容吗?

2 个答案:

答案 0 :(得分:3)

文档说,即使你将延迟时间设置为0,你也可能会在加载时进行一些批量处理,因为记录被添加的速度比发送线程可以发送的速度快。此设置针对最小延迟进行了优化。如果您真正关心的性能衡量标准是吞吐量,那么您可以将停留时间稍微增加到更多批次以及文档的内容。在这种情况下,与同步发送无关。 More in depth info

答案 1 :(得分:3)

使用linger.ms=0记录会尽快发送,并且有许多请求可能会影响性能。通过在中等/高负载上增加linger.ms来强制稍微等待将优化批次的使用并增加吞吐量。这也取决于记录大小,批量越小(batch.size默认值为16Kb)就越大。

基本上它是请求数量和吞吐量之间的折衷,它实际上取决于您的场景,但是立即发送并不能充分利用批处理和压缩(如果启用)而我建议运行一些具有不同linger.ms值的指标,例如0/5/10/50/200

一般情况下,我建议设置linger.ms > 0

参考文献: