我正在使用kafka将网站用户的页面访问事件流式传输到分析服务。每个事件将包含消费者的以下详细信息:
我需要非常高的吞吐量,因此我决定使用分区键将主题分区为userId-ipAddress
即
对于userId 1000和ip地址10.0.0.1,该事件将具有 分区键为" 1000-10.0.0.1"
在此用例中,分区键是动态的,因此在创建主题时预先指定分区数。 是否可以使用动态分区计数在kafka中创建主题?
使用这种分区是一种好习惯还是有其他方法可以实现这种分区?
答案 0 :(得分:20)
无法使用动态分区计数创建Kafka主题。创建主题时,必须指定分区数。您可以稍后使用Replication Tools手动更改它。
但我不明白你为什么首先需要动态分区计数。分区键与分区数无关。您可以将分区键与十个分区或一千个分区一起使用。当您向Kafka主题发送消息时,Kafka必须将其发送到特定分区。每个分区都由它的ID识别,ID只是一个数字。卡夫卡计算这样的东西
partition_id = hash(partition_key) % number_of_partition
并将消息发送到分区partition_id
。如果你有比分区更多的用户,你应该没问题。更多建议:
userId
作为分区键。您可能不需要IP地址作为分区键的一部分。到底有什么好处呢?通常,您需要来自单个用户的所有消息才能以单个分区结束。如果您将IP地址作为分区键,则来自单个用户的消息可能会以多个分区结束。我不知道你的用例,但一般情况下并不是你想要的。 现在您应该能够处理系统中的所有消息。如果流量增加,您可以添加更多Kafka代理,您可以使用复制工具更改分区的领导者/副本。如果流量增长超过十倍,则必须创建新分区。