我正在使用kafka将网站用户的页面访问事件流式传输到分析服务。每个事件将包含以下有关消费者的详细信息:
我需要很高的吞吐量,因此我决定使用分区键
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地址用作分区键,则来自单个用户的消息可能会在多个分区中结束。我不知道您的用例,但总的来说这不是您想要的。 现在,您应该能够处理系统中的所有消息。如果流量增加,则可以添加更多的Kafka代理,并且可以使用复制工具来更改分区的领导者/副本。如果流量增长十倍以上,则必须创建新分区。
关于apache-kafka - 是否可以创建具有动态分区计数的kafka主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32761598/