【问题标题】:How does Apache Kafka producer send records to partitions parallelly?Apache Kafka 生产者如何将记录并行发送到分区?
【发布时间】:2019-03-31 08:47:33
【问题描述】:

从Kafka的API文档中找到了Apache Kafka中send()方法的描述(api document of producer):

“发送是异步的,一旦记录存储在等待发送的记录缓冲区中,此方法将立即返回。这允许并行发送许多记录,而不会阻塞等待每个记录之后的响应。”

我只是想知道记录是如何并行发送的?如果我有 3 个 broker,并且每个 broker 在同一主题下有 3 个分区,Kafka 生产者是否会并行将记录发送到 9 个分区?或者生产者只是将记录并行发送给 3 个代理?生产者如何并行工作?

【问题讨论】:

    标签: java parallel-processing apache-kafka


    【解决方案1】:

    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
    

    您可以通过生产者配置控制批处理的数量。

    (请注意,我回答了 9 个唯一分区,如果您指的是复制分区,则只发送给领导者 - 然后复制将处理传播)。

    【讨论】:

    • 感谢您的回答,当我说 9 时,我的意思是实际上是 9 个领导分区。那么这是否意味着,对于同一 broker 中的 3 个分区,它们不会并行接收消息?
    【解决方案2】:

    是的,Producer 会将发往每个分区领导者的消息进行批处理,并将并行发送。来自API Docs

    send() 方法是异步的。当被调用时,它将记录添加到 待处理记录的缓冲区发送并立即返回。这允许 生产者将各个记录批处理在一起以提高效率。

    生产者为每个分区维护未发送记录的缓冲区。 这些缓冲区的大小由 batch.size 配置指定。制造 这个更大可以导致更多的批处理,但需要更多的内存 (因为我们通常会为每个活动的缓冲区提供一个 分区)。

    这里有一个图表来帮助:

    【讨论】:

    • 我还要在这里注意一下——它可以在一个请求中为一个代理发送多条记录。
    猜你喜欢
    • 2021-04-25
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    相关资源
    最近更新 更多