我是卡夫卡的新人。我的要求是,我有两个分区,例如Partition-0和Partition-1,我有一个值列表,它们也包含KEY值。我想根据我的密钥存储数据,如key-1将转到Partition-0,key-2将转到Partition-1。使用旧的API,可以实现像我们需要实现分区接口,但我如何使用新API。谢谢
答案 0 :(得分:2)
如果您想要循环行为,只需在写入Producer时不传递密钥,DefaultPartitioner
将为您完成工作。您不需要编写自定义实现。来自javadocs:
/**
* The default partitioning strategy:
* <ul>
* <li>If a partition is specified in the record, use it
* <li>If no partition is specified but a key is present choose a partition based on a hash of the key
* <li>If no partition or key is present choose a partition in a round-robin fashion
*/
答案 1 :(得分:0)
使用新的制作人,您还可以实现Partitioner
接口(https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/Partitioner.java)以实现循环分发。
您可以使用DefaultPartitioner
作为参考 - https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/internals/DefaultPartitioner.java
答案 2 :(得分:0)
你可以通过覆盖kafka制作人的default partitioner以循环方式制作给kafka。
伪实现
class RRPartitioner():
def __init__():
# Using topic metadata get total number of partitions
self.total_partitions = client[topic].get_number_partitions()
self.part_offset = 0
def partitioner(self, key, msg):
if self.part_offset > self.total_partitions:
self.part_offset = 0
return self.part_offset
else:
self.part_offset += 1
return self.part_offset
以上实现它是纯粹的循环,如果你想根据密钥订购消息并进行循环,你将需要在自定义分区器中做更多的事情。
答案 3 :(得分:0)
从Kafka 2.4.0开始,您可以选择执行“始终”轮循。