Apache-Kafka,batch.size与buffer.memory

时间:2018-04-04 10:56:48

标签: apache-kafka kafka-producer-api

我试图找出Kafka Producer中batch.size和buffer.memory设置之间的区别。

据我了解batch.size:它是可以发送的批次的最大大小。

该文档将buffer.memory描述为:Producer可用于缓冲等待发送的记录的内存字节。

我不明白这两者之间的区别。有人可以解释一下吗?

由于

3 个答案:

答案 0 :(得分:3)

我认为

batch.size :单个请求中可以发送的最大数据量。如果batch.size为(32 * 1024),则意味着可以在单个请求中发送32 KB。

buffer.memory :如果Kafka Producer无法将消息(批次)发送到Kafka经纪人(说经纪人已关闭)。它开始在缓冲存储器(默认32 MB)中累积消息批处理。一旦缓冲区已满,它将等待“ max.block.ms ”(默认为60,000ms),以便可以清除缓冲区。然后引发异常。

答案 1 :(得分:0)

Confluent documentation page中描述了这两种生产者配置,如下所示:

  • batch.size

Kafka生产者试图将发送的消息分批收集以提高吞吐量。使用Java客户端,您可以使用 batch.size 控制每个消息批处理的最大大小(以字节为单位)。

  • buffer.memory

使用 buffer.memory 来限制Java客户端可用于收集未发送消息的总内存。达到此限制后,在引发异常之前,制作人将阻止其他发送,直到 max.block.ms

答案 2 :(得分:0)

Kafka Producer 和 Kafka Consumer 有许多有助于性能调整的配置,例如获得低延迟和高吞吐量。 buffer.memorybatch.size 也是其中之一,这些是 Kafka Producer 特有的。让我们看看这些配置的更多细节。

  1. buffer.memory 这设置了生产者将用于缓冲等待发送到代理的消息的内存量。如果应用程序发送消息的速度比传送到服务器的速度快,生产者可能会耗尽空间,并且额外的 send() 调用将被阻止或基于 ma​​x.block.ms 抛出异常允许阻塞一段时间然后抛出异常的配置。另一种情况可能是,如果所有代理服务器由于任何原因而关闭,并且 kafka 生产者将无法向代理发送消息,并且生产者必须将这些消息保存在基于 buffer.memory 配置分配的内存中,但是如果代理没有恢复正常状态,这将很快被填满,然后如上所述 mx.block.ms 时间将被视为释放空间。 max.block.ms 的默认值为 60,000 ms buffer.memory 的默认值为 32 MB (33554432)

  2. batch.size 当多个记录发送到同一个分区时,生产者会将它们批量放入。此配置以字节(不是消息)为单位控制内存量 用于每个批次。当批处理已满时,将发送批处理中的所有消息。然而,这并不意味着生产者将等待批次变满。生产者将发送半满批次,甚至只发送一条消息的批次。因此,将批量大小设置得太大不会导致发送消息的延迟。它只会为批次使用内存。将批量大小设置得太小会增加额外的开销,因为生产者需要更频繁地发送消息。 默认批量大小为 16384。

batch.size 也基于 linger.ms 工作,它控制在发送当前批次之前等待附加消息的时间量。我们知道,当 rge 当前批次已满或达到 linger.ms 时间时,Kafka 生产者会发送一批消息。默认情况下,生产者会在有可用的发送者线程发送消息时立即发送消息,即使 bacth 中只有消息。