卡夫卡生产者发送消息的分区策略

分区器

客户端可以控制将消息发送到哪个分区

Kafka默认分区机制(org.apache.kafka.clients.producer.internals.DefaultPartitioner):

如果记录中指定了分区,则直接使用

如果未指定分区,但指定了key值,则根据key的hash值选择一个分区(相同的key所发送到的Partition是同一个,可用来保证消息的局部有序性)

如果未指定分区,也未指定key值,则以 '黏性分区' 策略(2.4版本以前使用轮询策略)选择一个分区

分区策略

轮询策略(org.apache.kafka.clients.producer.RoundRobinPartitioner)

如果key值为null,并且使用了默认的分区器,Kafka会根据轮训(Random Robin)策略将消息均匀地分布到各个分区上。

散列策略(Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions)

如果键值不为null,并且使用了默认的分区器,Kafka会对键进行散列,然后根据散列值把消息映射到对应的分区上

黏性分区策略(org.apache.kafka.clients.producer.UniformStickyPartitioner)

很多时候消息是没有指定Key的。而Kafka 2.4之前的策略是轮询策略,这种策略在使用中性能比较低。所以2.4中版本加入了黏性分区策略(Sticky Partitioning Strategy)。

黏性分区器(Sticky Partitioner)主要思路是选择单个分区发送所有无Key的消息。一旦这个分区的batch已满或处于“已完成”状态,黏性分区器会随机地选择另一个分区并会尽可能地坚持使用该分区——象黏住这个分区一样

自定义策略

默认分区器是使用次数最多的分区器。除了散列分区之外,用户可以根据需要对数据使用不一样的分区策略

实现org.apache.kafka.clients.producer.Partitioner接口,在配置中设置实现的类prop.put("partitioner.class", 实现类);

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡夫是一个分布式流处理平台,可以通过Python的kafka-python库来发送和接收消息。 以下是一个简单的Python程序,用于向Kafka主题发送消息: ```python from kafka import KafkaProducer # 创建Kafka生产者 producer = KafkaProducer(bootstrap_servers=['localhost:9092']) # 发送消息 producer.send('test-topic', b'Hello, Kafka!') # 等待所有消息发送 producer.flush() # 关闭生产者连接 producer.close() ``` 在上面的代码中,我们首先创建了一个Kafka生产者,并指定了Kafka集群的地址。然后,我们使用`producer.send()`方法来向`test-topic`主题发送一条消息。我们使用`producer.flush()`方法来确保所有消息都被发送。最后,我们关闭生产者连接。 要接收Kafka主题中的消息,可以使用Python的kafka-python库中的KafkaConsumer类。以下是一个简单的Python程序,用于接收Kafka主题中的消息: ```python from kafka import KafkaConsumer # 创建Kafka消费者 consumer = KafkaConsumer('test-topic', bootstrap_servers=['localhost:9092']) # 接收消息 for message in consumer: print(message.value) ``` 在上面的代码中,我们首先创建了一个Kafka消费者,并指定了Kafka集群的地址和要消费的主题。然后,我们使用`for`循环来遍历消费者接收到的所有消息,并打印它们的值。 需要注意的是,Kafka是一个分布式流处理平台,因此在实际使用中需要考虑许多因素,例如主题的分区消息的可靠性等等。以上代码仅仅是一个简单的示例,实际情况可能会更加复杂。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值