Apache Kafka生产者如何将记录并行发送到分区?

时间:2018-10-26 14:50:42

标签: java parallel-processing apache-kafka

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

  

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

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

2 个答案:

答案 0 :(得分:1)

Kafka客户端使用的exports.handler = (event, context, callback) => { const userId = event.arguments.userId; const userParam = { Key: { "userId":{S:userId} }, TableName:"FidelityCardsUsers" } dynamoDB.getItem(userParam, function(err, data) { if (err) { console.log('error from DynamDB: ',err) callback(err); } else { console.log('mastercards: ',JSON.stringify(data)); callback(null,data) } }) 可以一次为多个分区携带有效载荷(请参见http://kafka.apache.org/protocol.html#The_Messages_Produce)。

因此,它并行地(使用org.apache.kafka.common.requests.ProduceRequest)将三个请求发送给(三个)代理中的每个代理,即:

org.apache.kafka.clients.NetworkClient

您可以控制通过生产者配置完成多少批次。

(注意,我回答了9个唯一的分区,如果您要复制的分区,则仅发送给领导者,则复制将处理传播)。

答案 1 :(得分:1)

是的,生产者将分批发送给每个分区负责人的消息并并行发送。来自API Docs

  

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

  

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

下面的图表可以帮助您: enter image description here