一、简介
1.Kafka是什么?
Kafka是基于 发布-订阅 模式的分布式流处理平台(消息队列)。
2.我们为什么要选择Kafka?
Kafka用于流式数据的处理,被广泛应用于大数据实时计算、日志采集领域;kafka依赖zookeeper,会使项目的复杂度更进一步、可用性降低,如果只是单纯的需要消息中间件可以考虑别的消息队列;
二、Kafka的架构模型、角色以及职责的划分
1.Producer(生产者):
Producer负责连接broker,往Kafka集群中写消息;
2.Broker(kafka进程):
由broker组成一个kafka cluster,如图broker-0,1,2组成kafka集群;
3.Topic(主题):
用于区分消息,消息区分Topic存储,旨在给消息做分类;
4.Partition(分区):
同一Topic分为N个partition(创建topic时指定),分区的目的是为了提高kafka的并发力,且方便集群扩展;
5.Leader(同一Partition所有副本中的Leader):
生产消息或消费消息的Partition副本,都将由Leader完成
6.Follower(Leader副本数据的冗余)
Leader副本的备份,只负责同步Leader的数据,它与Leader一定不会在同一个Broker中,在Partition的Leader宕机时选举Follower中的任意一个为Leader,旨在提高kafka的可用性;
7.Consumer & Consumer Group (消费者组):
消费者 & 消费者组,需要注意的是,同一个Partition(分区)的消息,只能被同一个消费者组中一个消费者消费(如图Consumer Group 0中只有Consumer0或Consumer1中的其中一个消费者能消费到Topic0-partition0中的数据);Consumer Group可以提高消费能力,例如一个微服务中的某一模块都去一个Topic中消费各自的消息,可以更快的将消息消化。注意,如果Consumer数量超过Partition的数量,会有消费者消费不到数据
8.Zookeeper:
(1)存储offset;
(2)选举与管理Controller;
9.Offset
0.9版本之前用于存储消费者消费数据的Offset,为了防止Broker宕机的同时也丢失消息消费位置,所以需要将Offset保存在zk中;0.9版本之后Offset存储在本地的系统topic中;(假设机器宕机,消费者下次还需按原本消费到的位置消费消息,所以需要Offset记录消费位置);
10.Segment
每一个分区(partition),都对应着N个Segment,为什么需要将分区分片?答案是当数据过大时会降低查找数据的效率,为此kafka将一个partition分割为多个Segment,每个Segment对应一个.index(索引文件),一个.log(数据文件);
.log文件如果超过log.segment.bytes大小(默认1G),将会创建一个新的segment,也就是说,如果数据大小为N(G),则总共有N个segment。
三、Kafka工作流程
(1).生产消息工作流程
1.producer生产消息后执行Send方法,经过拦截器拦截、序列化器系列化、再经由分区器的分区,如果手动指定分区则按手动指定的分区投放;如果没有指定Partition则对key值hash再取模partition数量进行分区;如果既没有指定Partition也没有key将会使用随机数递增取模的方法来指定partition。
2.消息经过Partitioner分区后将由RecordAccumulator来暂存消息,为什么需要暂存消息?答案是为了减少连接次数,降低系统开销,类似缓冲区,等一个缓冲区的数据满了才开始写或读。
3.Sender线程是基于事件监听工作的,如果dequeue的数据大小到达batch.size(配置参数)或者大小未达到但linger.time(配置参数)达到,Sender线程监听到两个事件其中的任何一个将会把数据发送给kafka,并落盘至指定的Partition中。
(2).Consumer工作流程
Kafka采用了Pull模式来消费数据,为什么用Pull模式?
是为了让消费者以自身的消费速度来消费数据,Pull模式的优点就是自适应消费速率,让消费者不会因为处理数据量太大而崩溃(好比小时候我妈喂我吃饭,我快撑死了还在继续喂......),缺点也很明显,需要消费者自身维护一个长轮询,如果没有消息产出,则会出现"空转"的情况。针对Pull模式的缺点,kafka也为其做了优化,配置参数,让一次无数据的pull过后经过一定的时长之后再继续拉取。
在消费者与kafka建立连接时(也就是启动消费者时),就会触发分区分配策略,为消费者确定,应该去哪几个Partition拉取数据(消费者新增、消费者减少、Topic的分区发生变化都会触发分区分配...)
综上,我认为Consumer的工作流程是(仅凭自己理解...):
1.与kafka建立连接,触发kafka的分区分配策略,确定consumer的消费分区;
2.consumer发起长轮询从分区中拉取数据,并提交offset,记录消费位置,以便故障时下一次我们能根据上一次消费的位置来消费消息。
下一篇:ISR、ACK保证生产者数据一致性以及副本同步策略:
kafka生产者的副本同步策略以及数据一致性、丢失消息、消息重复等问题的总结_一念花开_的博客-CSDN博客



