Apache kafka 如何将卡夫卡中的消费者分配到特定分区;在我的例子中,分区是通过密钥的散列值分配的
当生产者使用数字分配分区时。例如Apache kafka 如何将卡夫卡中的消费者分配到特定分区;在我的例子中,分区是通过密钥的散列值分配的,apache-kafka,Apache Kafka,当生产者使用数字分配分区时。例如 kafkaTemplate.send(topic, 1, "[" + LocalDateTime.now() + "]" + "Message to partition 1"); number1第二个参数定义了我希望将消息发送到的分区id。因此,消费者可以使用此消息: TopicPartition partition1 = new TopicPartition(topic, 1); consumer1.assign(Arrays.asList(partit
kafkaTemplate.send(topic, 1, "[" + LocalDateTime.now() + "]" + "Message to partition 1");
number1第二个参数定义了我希望将消息发送到的分区id。因此,消费者可以使用此消息:
TopicPartition partition1 = new TopicPartition(topic, 1);
consumer1.assign(Arrays.asList(partition1));
但是对于使用DefaultPartitioner的生产者,如何根据其发送的密钥的散列来选择分区呢。例如:
kafkaTemplate.send(topic, "forpartition1", "testkey");
这里的键是“forpartition1”,我如何分配我的消费者从这个由“forpartition1”的散列键生成的分区消费。我是否再次计算消费者中该密钥的哈希值,或者是否有其他方法来实现这一点。我对这项技术相当陌生。根据您对卡夫卡的了解,我很想猜测您无意中尝试了一个高级用例,而这可能不是您想要的 常见的用例是将消息发布到主题。根据
键
为消息分配一个分区,同一键的所有消息都在同一分区结束
在使用者上,您订阅整个主题(没有明确要求分区),Kafka将处理所有可用使用者之间的分区分布
这就保证了具有特定密钥的所有消息都将由同一消费者处理(它们都进入同一分区,每个分区只有一个消费者处理),并且发送顺序相同
如果您真的想自己选择分区,您可以编写一个分区器类,并通过设置partitioner.class
configuration来配置生产者使用它
从
网上可以找到一些关于如何做的示例教程。这里有一个样本供参考:
NAME
partitioner.class
DESCRIPTION
Partitioner class that implements the org.apache.kafka.clients.producer.Partitioner interface.
TYPE
class
DEFAULT
org.apache.kafka.clients.producer.internals.DefaultPartitioner
VALID VALUES
IMPORTANCE
medium