何时触发生产者发送请求?

时间:2019-04-15 15:23:13

标签: apache-kafka

如果我仅在生产者端发送一条记录并等待,生产者什么时候将记录发送给经纪人? 在kafka文档中,我找到了名为“ linger.ms”的配置,内容为:

  

一旦我们获得了一个分区的记录的大小。   无论此设置如何,都会立即发送,但是如果有   更少   比这个分区累积的字节多,我们将“流连忘返”   在指定的时间内等待更多的记录显示。

根据上述文档,我有两个问题。

  1. 如果生产者收到大小达到batch.size的数据,它将立即触发向经纪人发送仅包含一个批次的请求?但是据我们所知,一个请求可以包含许多批次,那么它是如何发生的?

  2. 这是否意味着即使接收到的数据也不够batch.size,它也会在等待linger.ms后触发向经纪人发送请求?

1 个答案:

答案 0 :(得分:0)

在卡夫卡,发送的最低单位是一条记录(一对KV对)。

Kafka生产者尝试分批发送记录,以优化数据传输。因此,从生产者到集群的一次推送-确切地说是到经纪人的领导者-可能包含多个记录。

此外,批处理始终仅适用于给定的分区。生产到不同分区的记录虽然可以组成多个批次,但不能一起进行批处理。

documentation中所述,有一些参数会影响批处理行为:

buffer.memory-

  

生产者可以用来缓冲记录的内存总字节数   等待发送到服务器。如果记录发送速度比记录发送速度快   可以交付给服务器,生产者将阻止   max.block.ms,之后它将引发异常。

batch.size-

  

生产者将尝试将记录一起批处理成更少的数量   每当有多个记录发送到同一个请求   划分。这有助于提高客户端和服务器的性能。   此配置控制默认的批处理大小(以字节为单位)。没有   将尝试批处理大于此大小的记录。

     

发送给经纪人的请求将包含多个批次,每个批次   可以发送数据的分区。

linger.ms-

  

生产者将介于两者之间的任何记录组合在一起   请求传输到单个批处理请求中。通常这个   仅在负载到达时记录到达速度快于记录发生时间   送出。但是在某些情况下,客户可能希望减少   即使在中等负载下的请求数。这个设定   通过添加少量的人为延迟来实现此目的-   是,而不是立即发送记录,制作人将   等待最多给定的延迟以允许发送其他记录,因此   发送可以一起批处理。这可以认为是   类似于TCP中的Nagle算法。此设置为   限制批处理的延迟:一旦我们获得batch.size值   分区的记录,无论此记录如何,都将立即发送   设置,但是如果为   这个分区,我们将“徘徊”指定的时间等待   显示更多记录。此设置默认为0(即无延迟)。   例如,将linger.ms = 5设置为具有减少效果   发送的请求数,但会增加5ms的延迟   空载时发送的记录。

因此,从上述文档中,您可以理解-linger.ms是人为延迟,如果没有足够的字节要传输,则等待,但是如果生产者在linger.ms过去之前积累了足够的字节,则请求反正被发送。

最重要的是,批量处理还受max.request.size

的影响

最大请求大小-

  

请求的最大大小(以字节为单位)。此设置将限制   生产者将在单个请求中发送给的记录批数   避免发送大量请求。这实际上也是对   最大记录批次大小。请注意,服务器具有自己的上限   记录可能与此不同的批次大小。