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