kafka-带有分区键的消息放入错误的分区

时间:2018-07-16 11:40:21

标签: apache-kafka kafka-producer-api

我想知道,在什么情况下具有相同分区键的邮件会进入不同的分区。

我使用下面给出的命令运行了两个属于同一组的使用者,在控制台中监听一个主题:

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将消息放入主题abc。当我发送多个此类消息时,我发现很少有消息发送给第二个使用者,而大多数消息都发送给了使用者1。

由于我对所有消息使用相同的密钥abc,因此我希望所有消息都由同一使用者使用。每个使用者都绑定到每个分区。

我使用以下代码生成消息:

$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);

enter image description here

此屏幕截图清楚地显示了3条消息已发送给一个消费者,另一条消息已发送给另一消费者

2 个答案:

答案 0 :(得分:0)

根据Java docs

  

如果指定了有效的分区号,则将使用该分区   发送记录时。

     

如果未指定分区,但键是   当前,将使用键的哈希选择分区。

     

如果既没有密钥也没有分区,则将在   循环时尚

答案 1 :(得分:0)

您所说的是正确的,您应该看到同一使用者正在使用带有相同键“ abc”的消息。 您可以检查是否开始重新平衡,也许第一个消费者将分区留给另一个? 或者,使用此php kafka生产者(我从未使用过)可以跟踪每个消息放置在哪个分区中。卡夫卡生产者在发送消息时应获取RecordMetadata信息,以便知道消息分配在哪个分区和偏移量上。因为是决定目标分区的生产者,所以您应该确保php kafka生产者可以正常工作。