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

时间:2015-09-24 12:40:36

标签: apache-kafka partitioning kafka-consumer-api

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

  • 用户ID
  • 用户的IP地址

我需要非常高的吞吐量,因此我决定使用分区键将主题分区为userId-ipAddress

  

对于userId 1000和ip地址10.0.0.1,该事件将具有   分区键为" 1000-10.0.0.1"

在此用例中,分区键是动态的,因此在创建主题时预先指定分区数。 是否可以使用动态分区计数在kafka中创建主题?

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

1 个答案:

答案 0 :(得分:20)

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

但我不明白你为什么首先需要动态分区计数。分区键与分区数无关。您可以将分区键与十个分区或一千个分区一起使用。当您向Kafka主题发送消息时,Kafka必须将其发送到特定分区。每个分区都由它的ID识别,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代理,您可以使用复制工具更改分区的领导者/副本。如果流量增长超过十倍,则必须创建新分区。