我想知道,在什么情况下,具有相同分区密钥的消息会进入不同的分区。
我使用下面给出的命令,运行了属于同一组的两个使用者,在控制台中侦听某个主题:
sudo /etc/kafka/kafka_2.11-1.1.0/bin/kafka-console-consumer.sh --
bootstrap-server localhost:9092 --topic demo3 --consumer.config
config/consumer.properties --property print.key=true --property
key.separator=:
我使用“nmred/kafka php”库将消息放到主题中 demo3
带钥匙 . 当我发送多个这样的消息时,我发现很少有消息发送给第二个消费者,而大多数消息发送给消费者1。 因为我用的是同一把钥匙
对于所有消息,我希望所有消息都由同一个使用者使用。每个使用者都绑定到每个分区。
我使用以下代码生成消息:
$config = \Kafka\ProducerConfig::getInstance();
$config->setMetadataRefreshIntervalMs(10000);
$config->setMetadataBrokerList('x.x.x.x:9092', 'y.y.y.y:9092');
$config->setRequiredAck(1);
$config->setIsAsyn(false);
$config->setProduceInterval(500);
$producer = new \Kafka\Producer(
function() {
return [
[
'topic' => 'demo3',
'value' => 'test message.',
'key' => 'abc',
],
];
}
);
$producer->success(function($result) {
var_dump($result);
});
$producer->error(function($errorCode) {
var_dump($errorCode);
});
$producer->send(true);
这张截图清楚地显示,有3条消息已发送给一个消费者,另一条则发送给另一个消费者
2条答案
按热度按时间lh80um4z1#
根据java文档,
如果指定了有效的分区号,则在发送记录时将使用该分区。
如果没有指定分区,但存在一个密钥,则将使用密钥的哈希值来选择分区。
如果既不存在键也不存在分区,则将以循环方式分配分区
k10s72fa2#
您所说的是正确的,您应该看到同一消费者正在使用具有相同键“”的消息。你能检查一下重新平衡是否开始了,也许第一个消费者把分区留给了另一个吗?或者,使用这个php-kafka生产者(我从未使用过它)可以跟踪每条消息放在哪个分区中。kafka生产者应该在发送消息时获取recordmetadata信息,以便知道消息被分配到哪个分区和偏移量。因为目标分区是由生产者决定的,所以您应该确保php-kafka生产者工作正常。