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

viv*_*nam 18 partitioning apache-kafka kafka-consumer-api

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

  • 用户身份
  • 用户的IP地址

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

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

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

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

Luk*_*ant 25

无法使用动态分区计数创建Kafka主题.创建主题时,必须指定分区数.您可以稍后使用复制工具手动更改它.

但我不明白为什么你首先需要动态分区计数.分区键与分区数无关.您可以将分区键与十个分区或一千个分区一起使用.当您向Kafka主题发送消息时,Kafka必须将其发送到特定分区.每个分区都由它的ID标识,它只是一个数字.卡夫卡计算这样的东西

partition_id = hash(partition_key) % number_of_partition
Run Code Online (Sandbox Code Playgroud)

它将消息发送到分区partition_id.如果你有比分区更多的用户,你应该没问题.更多建议:

  • 使用userId的分区键.您可能不需要IP地址作为分区键的一部分.到底有什么好处呢?通常,您需要来自单个用户的所有消息才能以单个分区结束.如果您将IP地址作为分区键,则来自单个用户的消息可能会以多个分区结束.我不知道你的用例,但它一般不是你想要的.
  • 测量处理所有消息所需的分区数.然后创建让我们说十倍的分区.您可以创建比实际需要更多的分区.卡夫卡不介意,也没有性能惩罚.请参阅如何选择Kafka群集中的主题/分区数?

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