java—ApacheKafka生产者如何并行地将记录发送到分区?

6ojccjat  于 2021-06-06  发布在  Kafka
关注(0)|答案(2)|浏览(384)

从kafka的api文档中,我找到了apache kafka(producer的api文档)中send()方法的描述:
“发送是异步的,一旦记录存储在等待发送的记录缓冲区中,此方法将立即返回。这允许并行发送多个记录,而无需阻塞以等待每个记录之后的响应。”
我只是想知道这些记录是如何并行发送的?如果我有3个代理,并且在同一主题下的每个代理上有3个分区,那么kafka producer会并行地将记录发送到9个分区吗?或者制作人只是同时把唱片发给3个经纪人?制片人是如何并行工作的?

ogq8wdun

ogq8wdun1#

Kafka客户端使用 org.apache.kafka.common.requests.ProduceRequest 可以同时为多个分区承载有效负载(请参见http://kafka.apache.org/protocol.html#the_messages_produce).
因此它发送(使用 org.apache.kafka.clients.NetworkClient )同时向(三)名经纪人提出三项请求,即:

- sends records for topic-partition0, topic-partition1, topic-partition2 to broker 1
- sends records for topic-partition3, topic-partition4, topic-partition5 to broker 2
- sends records for topic-partition6, topic-partition7, topic-partition8 to broker 3

您可以控制使用producer配置完成的批处理量。
(请注意,我用9个唯一分区回答了这个问题,如果您的意思是复制分区,则只发送给leader—然后复制将处理传播)。

0sgqnhkj

0sgqnhkj2#

是的,生产者将成批发送给每个分区前导的消息,并将并行发送。从api文档:
send()方法是异步的。调用时,它将记录添加到挂起记录发送的缓冲区中,并立即返回。这允许制作者将单个记录批处理在一起以提高效率。

生产者为每个分区维护未发送记录的缓冲区。这些缓冲区的大小由batch.size配置指定。将其变大会导致更多的批处理,但需要更多的内存(因为每个活动分区通常都有一个缓冲区)。
下面是一个图表:

相关问题