从Kafka的API文档中,我在Apache Kafka(api document of producer)中找到了send()方法的描述:
“发送是异步的,一旦将记录存储在等待发送的记录缓冲区中,此方法将立即返回。这样可以并行发送许多记录,而不会阻塞等待每条记录之后的响应。”
我只是想知道记录是如何并行发送的?如果我有3个代理,并且每个代理在同一主题下有3个分区,Kafka生产者是否会将记录并行发送到9个分区?还是生产者将记录并行发送给3个经纪人?生产者如何并行工作?
答案 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配置指定。制造 这个较大的值可以导致更多的批处理,但需要更多的内存 (因为我们通常会为每个活动对象使用这些缓冲区之一 分区)。