栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Kafka的架构模型以及工作流程

Kafka的架构模型以及工作流程

  一、简介

        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博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/583870.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号