我想知道,在什么情况下具有相同分区键的邮件会进入不同的分区。
我使用下面给出的命令运行了两个属于同一组的使用者,在控制台中监听一个主题:
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条消息已发送给一个消费者,另一条消息已发送给另一消费者
答案 0 :(得分:0)
如果指定了有效的分区号,则将使用该分区 发送记录时。
如果未指定分区,但键是 当前,将使用键的哈希选择分区。
如果既没有密钥也没有分区,则将在 循环时尚
答案 1 :(得分:0)
您所说的是正确的,您应该看到同一使用者正在使用带有相同键“ abc”的消息。 您可以检查是否开始重新平衡,也许第一个消费者将分区留给另一个? 或者,使用此php kafka生产者(我从未使用过)可以跟踪每个消息放置在哪个分区中。卡夫卡生产者在发送消息时应获取RecordMetadata信息,以便知道消息分配在哪个分区和偏移量上。因为是决定目标分区的生产者,所以您应该确保php kafka生产者可以正常工作。