本文分享自华为云社区《Kafka生产者3种分区分配策略》,作者:石臻臻的杂货铺。

Kafka Producer在发送消息的时候,需要指定发送到哪个分区, 那么这个分区策略都有哪些呢?我们今天来看一下

使用分区策略的配置:

1. DefaultPartitioner 默认分区策略

全路径类名:org.apache.kafka.clients.producer.internals.DefaultPartitioner

  • 如果消息中指定了分区,则使用它
  • 如果未指定分区但存在key,则根据序列化key使用murmur2哈希算法对分区数取模。
  • 如果不存在分区或key,则会使用粘性分区策略,关于粘性分区请参阅 KIP-480。

粘性分区Sticky Partitioner

为什么会有粘性分区的概念?

首先,我们指定,Producer在发送消息的时候,会将消息放到一个ProducerBatch中, 这个Batch可能包含多条消息,然后再将Batch打包发送。关于这一块可以看看我之前的文章 图解Kafka Producer 消息缓存模型。

这样做的好处就是能够提高吞吐量,减少发起请求的次数。

但是有一个问题就是, 因为消息的发送它必须要你的一个Batch满了或者linger.ms时间到了,才会发送。如果生产的消息比较少的话,迟迟难以让Batch塞满,那么就意味着更高的延迟。

在之前的消息发送中,就将消息轮询到各个分区的, 本来消息就少,你还给所有分区遍历的分配,那么每个ProducerBatch都很难满足条件。

那么假如我先让一个ProducerBatch塞满了之后,再给其他的分区分配是不是可以降低这个延迟呢?

详细的可以看看下面这张图

这张图的前提是:

Topic1 有3分区, 此时给Topic1 发9条无key的消息, 这9条消息加起来都不超过batch.size .

那么以前的分配方式和粘性分区的分配方式如下

可以看到,使用粘性分区之后,至少是先把一个Batch填满了发送然后再去填充另一个Batch。不至于向之前那样,虽然平均分配了,但是导致一个Batch都没有放满,不能立即发送。这不就增大了延迟了吗(只能通过linger.ms时间到了才发送)

划重点:

  1. 当一个Batch发送之后,需要选择一个新的粘性分区的时候
    ①. 可用分区<1 ;那么选择分区的逻辑是在所有分区中随机选择。
    ②. 可用分区=1; 那么直接选择这个分区。
    ③. 可用分区>1 ; 那么在所有可用分区中随机选择。
  2. 当选择下一个粘性分区的时候,不是按照分区平均的原则来分配。而是随机原则(当然不能跟上一次的分区相同)

例如刚刚发送到的Batch是 1号分区,等Batch满了,发送之后,新的消息可能会发到2或者3, 如果选择的是2,等2的Batch满了之后,下一次选择的Batch仍旧可能是1,而不是说为了平均,选择3分区。

2.Uniform Sticky Partitioner 纯粹的粘性分区策略

全路径类名:org.apache.kafka.clients.producer.internals.UniformStickyPartitioner

他跟Default Partitioner 分区策略的唯一区别就是。

Default Partitionerd 如果有key的话,那么它是按照key来决定分区的,这个时候并不会使用粘性分区
Uniform Sticky Partitioner 是不管你有没有key, 统一都用粘性分区来分配。

3. Round Robin Partitioner 分区策略

全路径类名:org.apache.kafka.clients.producer.internals.RoundRobinPartitioner

  • 如果消息中指定了分区,则使用它
  • 将消息平均的分配到每个分区中。
  • 与key无关
    @Overridepublic int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);int numPartitions = partitions.size();int nextValue = nextValue(topic);List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic);if (!availablePartitions.isEmpty()) {int part = Utils.toPositive(nextValue) % availablePartitions.size();return availablePartitions.get(part).partition();} else {// no partitions are available, give a non-available partitionreturn Utils.toPositive(nextValue) % numPartitions;}}

上面是具体代码。有个地方需要注意;

  1. 当可用分区是0的话,那么就是遍历的是所有分区中的。
  2. 当有可用分区的话,那么遍历的是所有可用分区的。

 点击关注,第一时间了解华为云新鲜技术~

Kafka生成消息时的3种分区策略相关推荐

  1. Kafka Range、RoundRobin、Sticky 三种 分区分配策略区别

    Kafka Range RoundRobin 和Sticky 三种 分区分配策略 一.Kafka默认分区分配策略 1.1 consumer 订阅 1 topic ( 7 partition ) 按照K ...

  2. kafka源码分析-consumer的分区策略

    kafka源码分析-consumer的分区策略 1.AbstractPartitionAssignor 2.RangeAssignor 3.RoundRobinAssignor 4.StickyAss ...

  3. kafka:消息发送以及消费的过程

    摘要 kafka的存储消息,生产者发送消息,消费者消费消息.这些看起来简单,但实际细想,会有很多问题需要解决:消息是单个单个发送还是批量发送?broker的主题里一有消息就立即推送给消费者吗?生产者的 ...

  4. kafka的分区策略(partition assignment strategy)

    概述 kafka的分区策略指的是producer端的 各个partition中的数据如何安排给consumer消费. Range(按范围) ange策略是对每个主题而言的,首先对同一个主题里面的分区按 ...

  5. kafka的分区策略

    kafka的分区策略 kafka produce端的分区策略 第一种分区策略:给定了分区号,直接将数据发送到指定的分区里面去第二种分区策略:没有给定分区号,给定数据的key值,通过key取上hashC ...

  6. cassandra随机获取数据_Cassandra维护最终一致性 和存储机制 分区策略

    维护最终一致性 Cassandra通过4个技术来维护数据的最终一致性,分别为逆熵(Anti-Entropy),读修复(Read Repair),提示移交(Hinted Handoff)和分布式删除. ...

  7. 数据表分区策略及实现

    转载自:https://blog.csdn.net/why_2012_gogo/article/details/51492573 数据表分区策略及实现(一): 什么是表分区?表分区其实就是将一张大数据 ...

  8. cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH

    转自:http://asyty.iteye.com/blog/1202072 一.Cassandra框架 二.Cassandra数据模型 Colum / Colum Family, SuperColu ...

  9. kafka生产者消息分区策略

    前言 众所周知,kafka的topic具有分区的概念,生产者写入数据到kafka之后,涉及到数据到底写到哪个分区? 常用的分区写入策略 生产者写入消息到topic,Kafka将依据不同的策略将数据分配 ...

最新文章

  1. 图书馆自动化系统 Evergreen 3.3 发布,迁移到 Angular
  2. 计算机社区活动,计算机与信息学院“e修哥”党支部进社区开展志愿服务活动...
  3. django-rest-swagger显示接口备注内容
  4. 20200329:K 个一组翻转链表(leetcode25)
  5. Nginx屏蔽个别User-Agent蜘蛛访问网站的方法
  6. Ubuntu系统下如何在不重启的情况下永久修改hostname主机名
  7. GDAL1.11版本对SHP文件索引加速测试
  8. excel线性拟合的斜率_Excel 计算线性回归线斜率:SLOPE函数
  9. JFlash合并两个BIN文件
  10. 高德地图改变地图的主题色
  11. 2014校园招聘_华为2014校园招聘
  12. 20190408-相速度和群速度、傅里叶变换与波动方程的色散关系、介电常数与电导、介电函数与折射率、散度定理、电子迁移率、电磁波波动方程、自由电子气的介电函数
  13. Spring入门之bean的配置
  14. 去除【CSDN论坛】【博客】所有广告的方法(非会员or非专家/版主 也可使用哦)
  15. 难倒高手了,c语言枚举end的作用是什么?
  16. 聚观早报 | 通信行程卡正式宣布下线;《三体》首日播放量破1亿
  17. Thrift交流(二)thrift服务端和客户端实现 Nifty
  18. Spring In Action 学习 第一章 Spring之旅
  19. SpringBoot系列
  20. 公司性格测试,来一发

热门文章

  1. 哲学家就餐 linux实现_Linux哲学的9个主要原则如何影响您
  2. 开源项目面试重要吗_年度最重要的开源新闻
  3. (28)css3 3D转换
  4. Bootstrap3 滚动监听插件的调用方式
  5. imail PHP,NT下基于邮件服务软件(IMAIL)的邮件发送程序–(本地版)-PHP教程,邮件处理...
  6. 深度学习笔记(30) Inception网络
  7. 计算机图形学二维图形基本变换实验原理,计算机图形学实验:二维图形变换.docx...
  8. c语言打开文件出现分段故障,c fclose() 导致分段故障_segmentation-fault_开发99编程知识库...
  9. 3,外键之表关联关系,修改表,复制表
  10. perl hash array 嵌套 push