分区密钥放入错误分区的消息

rkue9o1l  于 2021-06-08  发布在  Kafka
关注(0)|答案(2)|浏览(342)

我想知道,在什么情况下,具有相同分区密钥的消息会进入不同的分区。
我使用下面给出的命令,运行了属于同一组的两个使用者,在控制台中侦听某个主题:

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条消息已发送给一个消费者,另一条则发送给另一个消费者

lh80um4z

lh80um4z1#

根据java文档,
如果指定了有效的分区号,则在发送记录时将使用该分区。
如果没有指定分区,但存在一个密钥,则将使用密钥的哈希值来选择分区。
如果既不存在键也不存在分区,则将以循环方式分配分区

k10s72fa

k10s72fa2#

您所说的是正确的,您应该看到同一消费者正在使用具有相同键“”的消息。你能检查一下重新平衡是否开始了,也许第一个消费者把分区留给了另一个吗?或者,使用这个php-kafka生产者(我从未使用过它)可以跟踪每条消息放在哪个分区中。kafka生产者应该在发送消息时获取recordmetadata信息,以便知道消息被分配到哪个分区和偏移量。因为目标分区是由生产者决定的,所以您应该确保php-kafka生产者工作正常。

相关问题