【问题标题】:kafka - message with partition key put into wrong partitionkafka - 带有分区键的消息放入错误的分区
【发布时间】:2018-07-16 11:40:20
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

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

    【讨论】:

    • 在我发送这些消息期间没有重新平衡
    • 那么您需要从 Kafka PHP 生产者那里获取一些日志,以及它如何处理来自密钥的目标分区,以及它是否始终基于相同的密钥。
    • 问题似乎出在客户端本身。我尝试使用 java 客户端,它使用默认分区算法按预期工作。该问题与 php 库中的分区算法有关。
    • 如果不可能发生重新平衡,那它肯定是 PHP 客户端;)
    • 你应该检查 PHP Kafka 客户端源代码,也许它不支持键控消息,但它只是使用循环。你用的是什么客户端?
    【解决方案2】:

    根据Java docs

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

    如果没有指定分区但有一个键 现在将使用键的哈希选择一个分区。

    如果既不存在键也不存在分区,则将分配一个分区 循环时尚

    【讨论】:

    • 感谢您的回答。我正在使用分区键,对于我发送的消息,我使用了相同的分区键(“abc”),这不应该导致相同的哈希值和相同的分区吗?
    • 你需要看一下php Producer的实现,看看key是否发送正确。
    • 当我在消费者控制台中打印密钥时,很明显密钥已正确传递。
    • 你确定你的消费者不会消费来自多个分区的消息吗?
    • 我有两个分区。根据以下命令的 o/p: sudo bin/kafka-consumer-groups.sh --describe --group demo-group --bootstrap-server localhost:9092 我可以看到每个消费者都绑定到一个分区。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多