apache-kafka - 是否可以创建具有动态分区计数的kafka主题?

标签 apache-kafka partitioning kafka-consumer-api

我正在使用kafka将网站用户的页面访问事件流式传输到分析服务。每个事件将包含以下有关消费者的详细信息:

  • 用户ID
  • 用户
  • 的IP地址

    我需要很高的吞吐量,因此我决定使用分区键userId-ipAddress对主题进行分区


    For a userId 1000 and ip address 10.0.0.1, the event will have partition key as "1000-10.0.0.1"



    在这种情况下,分区键是动态的,因此在创建主题时预先指定分区数。
    是否可以在kafka中创建具有动态分区计数的主题?

    使用这种分区是一种好习惯吗?或者还有其他方法可以实现吗?

    最佳答案

    无法创建具有动态分区数的Kafka主题。创建主题时,必须指定分区数。您可以稍后使用Replication Tools手动更改它。

    但是我不明白为什么首先需要动态分区计数。分区键与分区数无关。您可以将分区键用于十个分区或一千个分区。当您向Kafka主题发送消息时,Kafka必须将其发送到特定分区。每个分区都通过其ID(仅是一个数字)来标识。卡夫卡计算像这样

    partition_id = hash(partition_key) % number_of_partition
    

    它将消息发送到分区partition_id。如果您的用户数远远超过分区数,则应该可以。更多建议:
  • 使用userId作为分区键。您可能不需要IP地址作为分区键的一部分。到底有什么好处呢?通常,您需要来自单个用户的所有消息才能最终位于单个分区中。如果您将IP地址用作分区键,则来自单个用户的消息可能会在多个分区中结束。我不知道您的用例,但总的来说这不是您想要的。
  • 衡量处理所有消息所需的分区数量。然后再创建十倍的分区。您可以创建超出实际需要的分区。卡夫卡不会介意,也没有性能方面的损失。参见How to choose the number of topics/partitions in a Kafka cluster?

  • 现在,您应该能够处理系统中的所有消息。如果流量增加,则可以添加更多的Kafka代理,并且可以使用复制工具来更改分区的领导者/副本。如果流量增长十倍以上,则必须创建新分区。

    关于apache-kafka - 是否可以创建具有动态分区计数的kafka主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32761598/

    相关文章:

    apache-kafka - 如何在 Kafka Source Connector 中编写自定义 SMT 来混淆私有(private)数据

    MySQL Ver 15.1 不分区表

    join - 非 equi 中的分桶加入 hive

    database-design - 要索引的列太多 - 使用 mySQL 分区?

    java - Kafka 数据丢失,在生产者中

    java - Kafka 自动提交在幕后是同步还是异步?

    apache-kafka - Kafka 高级消费者可以分配到特定的分区吗?

    docker - 使JMX与Spotify/Kafka Docker镜像一起使用

    java - 从 Kafka Streams 反序列化对象时出错

    java - spring kafka 寻找主题中最新的可用消息