登 录
注 册
< 大 数 据
Flink
Hadoop
Spark
Hive
HBase
Kafka
其他框架
分布式消息队列
Kafka命令行操作
生产者与幂等性
ExactlyOnce与事务
分区消费策略
手动提交offset
Kafka对接Flume
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
Kafka
>>
分区消费策略
分区消费策略
2020-07-04 14:59:36 星期六 阅读:1860
####消费方式 消费者有两种数据消费方式 ``` pull模式:消费者主动从broker拉取数据 push模式:由broker主动向各个消费者推送数据 ``` 在Kafka中,consumer默认采用pull模式从broker中读取数据。 - pull模式的缺点:如果kafka没有数据,消费者可能会陷入循环中。一直返回空数据。针对这一点,`Kafka的消费者在消费数据时会传入一个时长参数timeout`,如果当前没有数据可供消费,consumer会等待一段时间之后再返回。 - push模式的缺点:很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。它的目标是尽可能以最快的速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式可能根据consumer的消费能力以适当的速率消费消息。 ####分区分配策略 一个消费者组里有多个消费者,一个topic有多个分区,所以必然会涉及到partition的分配问题,即确定哪个partition由哪个消费者来消费。Kafka有两种分配策略:**`RoundRobin与Rang`** ** RoundRobin(轮询)** 轮询的优点:消费者组里的各个消费者消费分区的个数最多相差1,比较均匀 轮询的缺点:如果消费者组订阅了多个topic,那么不管每个topic有多少个partition,都会把每个topic当成一个整体(普通分区)轮询发送给一个消费者。因为轮询的方法我们不能控制那个topic被哪个消费者消费,而不同的topic业务逻辑肯定不同。所以`为了使业务逻辑正确,消费者组要保证组里的所有消费者消费的是同一个topic。` **Range** Range是kafka默认的分配策略,它是以主题来划分的。比如现在t1主题有5个分区,t2主题有6个分区,有一个消费者群组(2个消费者:c1,c2)订阅了这两个主题。那么: t1主题中的前3个分区会被划分给消费者c1消费,后2个分区会被划分给c2消费者消费 t2主题中的前3个分区会被划分给消费者c1消费,后3个分区会被划分给c2消费者消费 这样一来,消费者c1就总共消费了6个分区,而消费者c2总共消费了5个分区 这种方案有个缺点:如果有10个topic,每个topic都有5个分区,那么消费者c1就会被分到30个分区,消费者c2就会被分到20个分区,随着主题数量的增加,c1与c2消费的分区数还会不断加大。 range还支持另一种分配方法,比如有两个topic:t1与t2,两个topic都有3个分区,有一个消费者组有两个消费者A、B,其中A、B都订阅了t1,而只有B订阅了t2。那么消费者A就会被分配到2个分区(都来自t1),消费者B就会被分配到4个分区(1个来自t1,3个来自t2) 这说明`range分配首先是看哪个消费者订阅了该topic,然后再看这些消费者是否在一个组` **分区分配策略的生效时间** 当消费者组里的消费者个数发生变化(增加或者减少)的时候就会触发重新分配。有一种极端情况,当消费者个数与topic分区个数相等的时候,如果再加入一个消费者,也会触发重新分配,重新分配后,有可能刚加入的消费者被闲置;也有可能刚加入的消费者被分配到了分区,而之前的某个消费者被闲置。 ####Offset维护 不管是老版本(0.9版本之前,offset保存到zk),还是新版本(0.9版本之后,offset保存到broker),消费者offset的存储策略都是一样的 Kafka通过以下三个信息来唯一确定一个分区的偏移量 - 消费者组 主题 分区号 翻译一下就是:**`某个主题的某个分区,被某个消费者群组消费到哪个位置了`**。这样,当某个消费者挂了,或者新增消费者,群组里的其他消费者接管分区时,就知道从什么位置开始消费。之所以不按照消费者+主题+分区号来存储偏移量,是因为消费者非常容易挂掉。挂掉之后其他消费者接管的时候就不知道消费者的名字,从而不知道该消费者消费到哪了。但是按照消费者组+主题+分区号来存储偏移量就不一样了。消费者随便挂,分区偏移量都是按照组来保存的。 在0.9版本之后,consumer默认将offset保存到一个内置的topic中,该topic为__consumer_offsets。