当前位置: 首页 > 知识库问答 >
问题:

如何根据user\u id对Kafka中的主题进行分区?

钱毅
2023-03-14

我正在使用SpringBoot构建一个Web应用程序后端,我必须使用Kafka发送消息。我想有一个主题,例如“testTopic”,我想在那里生成一些来自不同用户的消息,以便稍后将消息发送到不同的机器。

如果用户A向其机器发送消息,而用户B向其机器发送消息。我如何区分谁发送了哪条消息以及该消息应该到达哪台机器?

我读过关于Kafka主题划分的文章,但我不知道我在代码中是否做得很好。

我在这里建立我的话题

    @Bean
public NewTopic kafkaExampleTopic() {
    return TopicBuilder.name("TestTopic").partitions(1).build();
}

在这里,我将数据发送到该主题

    @Bean
CommandLineRunner commandLineRunner(KafkaTemplate<String, String> kafkaTemplate) {
    return args -> {
        kafkaTemplate.send("TestTopic", String.valueOf(MessageBuilder.withPayload("Hello kafka testTopic uno con key 1")
                .setHeader(KafkaHeaders.MESSAGE_KEY, "1").build()));
        kafkaTemplate.send("TestTopic", String.valueOf(MessageBuilder.withPayload("Hello kafka testTopic uno con key 2")
                .setHeader(KafkaHeaders.MESSAGE_KEY, "2").build()));
    };
}

这是我的听众

    @KafkaListener(topics = "TestTopic", groupId = "exampleGroupId")
public void listenWithHeaders(
        @Payload String message,
        @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) {
    System.out.println(
            "Received Message: " + message
                    + "from partition: " + partition);
}

非常感谢你们!

共有1个答案

潘宝
2023-03-14

主题划分需要提前决定。

例如,如果您有数字ID,您可以定义一个有十个分区的主题,然后创建自己的分区器类,该类将根据每个数字的前导数字将每个数字路由到分区中(ID 1、10、15等都转到分区1)。如果使用十六进制值(如UUID),则可能是一个具有16个分区(a-f,0-9)的主题。字母数字小写-36,以此类推。

默认情况下,Kafka的默认分区将按主题分区的数量执行Murmur2哈希模d。这样,例如,id 5和7可能最终在同一个分区中。根据您的消费者的需求,这可能不是您想要的。

消费者是在不同机器上运行的人。分区应该无关紧要,除非知道不能为同一组的使用者分配相同的分区(如果只有一个分区,则每个组只有一个使用者可以读取)。

 类似资料:
  • 我试图为我的Kafka Connect Sink指定一个主题分区。特别是,我正在使用DataStax Apache Kafka连接器。 有大量与为 Kafka 使用者指定主题分区相关的文档和资源,例如: https://kafka-tutorials.confluent.io/kafka-console-consumer-read-specific-offsets-partitions/kafka

  • 通过Kafka文档和各种其他资源,我了解到Kafka中的消息被组织成主题。此外,主题可以分解为多个分区,每个分区可以托管在不同的服务器上。这提供了冗余和可伸缩性。 我不确定这里的“破碎”这个词是什么意思。这是否意味着,如果添加到主题的消息是,例如“1 2 3 4 5 6 7”,那么在将其分解为分区后,我们将有一个分区仅包含整个主题的子部分。就像一个分区有“1 2 3”,而另一个分区有“4 5 6”

  • Kafka主题分区偏移位置始终从0或随机值开始,如何确保使用者记录是分区中的第一条记录?有没有办法找出答案?如果有的话,请让我知道。谢谢。

  • 问题内容: 我有一张像这样的表: SQL或蜂巢中是否有一种方法可以将其转换为类似表的形式: 我不确定有没有一个词来描述这种操作…任何帮助将不胜感激! 问题答案: 这基本上是一个。您没有指定要使用的RDBMS,但是可以使用聚合函数和语句在任何数据库中获取结果: 参见带有演示的SQL Fiddle 结果:

  • 我有一个基因组位置的基因数据集,我希望根据相关的重复信息对该数据集中的行/基因组位置进行分组。我的意思是: 如果我有点a、B、C等的数据集: 我想通过为这些行设置匹配的组编号列来对彼此具有连接(无论是否直接)的那些进行分组,例如,此数据集分组为: 我的实际数据集的一个样本是染色体位置(CP),其中第一个数字是染色体,第二个数字(后面是A:)是该染色体上的基因组位置,因此看起来像这样(实际数据约为3