欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-partitions-allocation-strategy-1-range-assignor/


引言

按照Kafka默认的消费逻辑设定,一个分区只能被同一个消费组(ConsumerGroup)内的一个消费者消费。假设目前某消费组内只有一个消费者C0,订阅了一个topic,这个topic包含7个分区,也就是说这个消费者C0订阅了7个分区,参考下图(1)。

此时消费组内又加入了一个新的消费者C1,按照既定的逻辑需要将原来消费者C0的部分分区分配给消费者C1消费,情形上图(2),消费者C0和C1各自负责消费所分配到的分区,相互之间并无实质性的干扰。

接着消费组内又加入了一个新的消费者C2,如此消费者C0、C1和C2按照上图(3)中的方式各自负责消费所分配到的分区。

如果消费者过多,出现了消费者的数量大于分区的数量的情况,就会有消费者分配不到任何分区。参考下图,一共有8个消费者,7个分区,那么最后的消费者C7由于分配不到任何分区进而就无法消费任何消息。

上面各个示例中的整套逻辑是按照Kafka中默认的分区分配策略来实施的。Kafka提供了消费者客户端参数partition.assignment.strategy用来设置消费者与订阅主题之间的分区分配策略。默认情况下,此参数的值为:org.apache.kafka.clients.consumer.RangeAssignor,即采用RangeAssignor分配策略。除此之外,Kafka中还提供了另外两种分配策略: RoundRobinAssignor和StickyAssignor。消费者客户端参数partition.asssignment.strategy可以配置多个分配策略,彼此之间以逗号分隔。

RangeAssignor分配策略

RangeAssignor策略的原理是按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。对于每一个topic,RangeAssignor策略会将消费组内所有订阅这个topic的消费者按照名称的字典序排序,然后为每个消费者划分固定的分区范围,如果不够平均分配,那么字典序靠前的消费者会被多分配一个分区。

假设n=分区数/消费者数量,m=分区数%消费者数量,那么前m个消费者每个分配n+1个分区,后面的(消费者数量-m)个消费者每个分配n个分区。

为了更加通俗的讲解RangeAssignor策略,我们不妨再举一些示例。假设消费组内有2个消费者C0和C1,都订阅了主题t0和t1,并且每个主题都有4个分区,那么所订阅的所有分区可以标识为:t0p0、t0p1、t0p2、t0p3、t1p0、t1p1、t1p2、t1p3。最终的分配结果为:

消费者C0:t0p0、t0p1、t1p0、t1p1
消费者C1:t0p2、t0p3、t1p2、t1p3

这样分配的很均匀,那么此种分配策略能够一直保持这种良好的特性呢?我们再来看下另外一种情况。假设上面例子中2个主题都只有3个分区,那么所订阅的所有分区可以标识为:t0p0、t0p1、t0p2、t1p0、t1p1、t1p2。最终的分配结果为:

消费者C0:t0p0、t0p1、t1p0、t1p1
消费者C1:t0p2、t1p2

可以明显的看到这样的分配并不均匀,如果将类似的情形扩大,有可能会出现部分消费者过载的情况。对此我们再来看下另一种RoundRobinAssignor策略的分配效果如何。

欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-partitions-allocation-strategy-1-range-assignor/


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


Kafka分区分配策略(1)——RangeAssignor相关推荐

  1. Kafka分区分配策略(4)——分配的实施

    接上文: 1.[Kafka分区分配策略(1)--RangeAssignor] 2.[Kafka分区分配策略(2)--RoundRobinAssignor和StickyAssignor] 3.[Kafk ...

  2. Kafka分区分配策略(3)——自定义分区分配策略

    接上文: 1.[Kafka分区分配策略(1)--RangeAssignor] 2.[Kafka分区分配策略(2)--RoundRobinAssignor和StickyAssignor] 欢迎支持笔者新 ...

  3. Kafka分区分配策略(2)——RoundRobinAssignor和StickyAssignor

    接上文[Kafka分区分配策略(1)--RangeAssignor] 欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔 ...

  4. 9.Kafka 分区分配策略(Range分配策略 RoundRobin分配策略)

    前言 在 Kafka 实际生产过程中,每个 topic 都会有 多个 partitions.   1.多个Partitions有什么好处? ①多个 partition ,能够对 broker 上的数据 ...

  5. Kafka分区分配策略以及重平衡过程总结

    Kafka自身提供了三种分区分配策略,通过消费者端配置参数partition.assignment.strategy来控制. 1.RangeAssignor分配策略(kafka默认的分区策略) 通过配 ...

  6. Kafka分区分配策略(Partition Assignment Strategy)

    问题 用过 Kafka 的同学用过都知道,每个 Topic 一般会有很多个 partitions.为了使得我们能够及时消费消息,我们也可能会启动多个 Consumer 去消费,而每个 Consumer ...

  7. kafka分区分配策略

    kafka的分区分配策略大概可以分为一下几步: 前置条件: a.假设消费者组到对应的server的GroupCordinator是已知的,这个groupCordinator和消费组对应的_offset ...

  8. Kafka 原理以及分区分配策略剖析

    欢迎关注方志朋的博客,回复"666"获面试宝典 ‍ ‍一.简介‍ ‍ Apache Kafka 是一个分布式的流处理平台(分布式的基于发布/订阅模式的消息队列[Message Qu ...

  9. 【kafka】Kafka消费者分区分配策略详解

    文章目录 1.概述 2.RoundRobinAssignor详解 3.RangeAssignor详解 4.StickyAssignor详解 5.CooperativeStickyAssignor详解 ...

最新文章

  1. 去中心化已成大势所趋,手机的中枢地位岌岌可危?
  2. Linux知识积累(6) 系统目录及其用途
  3. 多模态语义分析_情感分析、多模态NLP、多语言翻译...这场NLP知识盛宴不可错过!...
  4. 吴恩达深度学习之五《序列模型》学习笔记
  5. Provisioning Services 7.8 入门系列教程之四 目标设备安装
  6. java 前端及后台轮询方法总结
  7. unity通过服务器地址下载文件
  8. 盖洛普 之 首先打破一切常规
  9. 牛顿迭代公式(详细)
  10. 任务,行动,目标、绩效管理,计划
  11. 怎样编辑PDF,PDF怎么删除页面
  12. 使用fiddler实现手机抓包
  13. 金庸群侠X版 会议纪要
  14. 让你的闲置iPad/安卓平板成为你电脑屏幕的扩展显示器!
  15. python面向对象爬取某鱼颜值区主播图片
  16. SAP 从零起步之 1.2 编辑科目表清单
  17. python汉语词典_Python 字典(Dictionary)
  18. 鸿蒙能超越苹果系统吗,任正非说,鸿蒙与苹果系统相媲美应该不需要两到三年!鸿蒙真的已经这么完善了吗?...
  19. 王文京:要么是新生代企业,要么是数字化重生企业
  20. windows 设置全局快捷键;

热门文章

  1. 解决Tomcat下源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示
  2. python练习---购物车
  3. 使用注解实现ssh整合
  4. 全备份失败后,如何手工清除exchange日志文件,附微软KB
  5. Linux:让普通用户临时性获得root用户权限
  6. Radware为夏威夷电信公司全新的DDoS攻击缓解服务提供支持
  7. Netty权威指南之伪异步I/O编程
  8. 我所认识的JavaScript正则表达式
  9. SecureCRT学习之道:SecureCRT经常使用快捷键设置与字体设置方法
  10. Linux下bash的PS1