三天掌握Kafka 消息队列 小白到专家之路!

Posted 魏小言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三天掌握Kafka 消息队列 小白到专家之路!相关的知识,希望对你有一定的参考价值。

01 为什么要使用消息中间件

  在没有使用消息中间件之前,许多传统的系统业务对于消息的处理一般会采用串行方式或者并行方法;
  例如,你去网站注册一个账号,网站服务器对我们的注册操作进行处理,下面是串行跟并行的处理方式。

  • 串行方式:
      用户注册发放优惠券:用户注册,发放优惠券,将注册信息记录到数据库后,发送注册消息邮件,再发送注册短信验证,每个过程消耗50毫秒,一共就需要200毫秒
  • 并行方式:
      并行方式与串行方式不同的就是,用户注册存储数据后只需要往MQ投递消息即可,后续的发送邮件、优惠券发放等可以同时完成,只需要100ms即响应,而不是根据上一个动作完成后再完成下一个动作,大大缩短了用户的等待时间,如下图:
    在这里插入图片描述
      到这里大家明白,什么是MQ消息中间件,全称MessageQueue,主要是用于程序和程序直接通信,异步+解耦

使用场景
  1)解耦:订单系统-》物流系统

  2)异步:用户注册-》发送邮件,初始化信息

  3)削峰:秒杀、日志处理

  4)还有跨平台 、多语言、分布式事务、最终一致性、RPC调用上下游对接,数据源变动->通知下游服务。

02 什么是Kafka呢

  1)Kafka是最初由Linkedin公司开发,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目,也是一个开源【分布式流处理平台】,由Scala和Java编写(也当做MQ系统,但不是纯粹的消息系统)

  2)核心是一种高吞吐量的分布式流处理平台,它可以处理消费者在网站中的所有动作流,比如 网页浏览,搜索和其他用户的行为等,应用于大数据实时处理领域,官网:http://kafka.apache.org/
在这里插入图片描述

03 kafka一些术语

  1)Broker:Kafka的服务端程序,可以认为一个mq节点就是一个broker。broker存储topic的数据

  2)Producer生产者:创建消息Message,然后发布到MQ中,该角色将消息发布到Kafka的topic中

  3)Consumer消费者: 消费队列里面的消息

  4)ConsumerGroup消费者组:同个topic, 广播发送给不同的group,一个group中只有一个consumer可以消费此消息

  5)Topic:每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic,主题的意思

  6)Partition分区:kafka数据存储的基本单元,topic中的数据分割为一个或多个partition,每个topic至少有一个partition,是有序的;一个Topic的多个partitions, 被分布在kafka集群中的多个server上;消费者数量 <=小于或者等于Partition数量

  7)Replication 副本(备胎):同个Partition会有多个副本replication ,多个副本的数据是一样的,当其他broker挂掉后,系统可以主动用副本提供服务;默认每个topic的副本都是1(默认是没有副本,节省资源),也可以在创建topic的时候指定;如果当前kafka集群只有3个broker节点,则replication-factor最大就是3了,如果创建副本为4,则会报错

  8)ReplicationLeader、ReplicationFollower:Partition有多个副本,但只有一个replicationLeader负责该Partition和生产者消费者交互;ReplicationFollower只是做一个备份,从replicationLeader进行同步

  9)ReplicationManager:负责Broker所有分区副本信息,Replication 副本状态切换

  10)Offset偏移量:每个consumer实例需要为他消费的partition维护一个记录自己消费到哪里的偏移offset;kafka把offset保存在消费端的消费者组里
在这里插入图片描述

04 特点总结

  1)多订阅者

  2)一个topic可以有一个或者多个订阅者

  3)每个订阅者都要有一个partition,所以订阅者数量要少于等于partition数量

  4)高吞吐量、低延迟: 每秒可以处理几十万条消息

  5)高并发:几千个客户端同时读写

  6)容错性:多副本、多分区,允许集群中节点失败,如果副本数据量为n,则可以n-1个节点失败

  7)扩展性强:支持热扩展

05 Kafka为什么性能强劲

  1)kafka的储存设计方面

  在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。每个partition(目录)被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。每一个sgement又包含了index文件和log文件,可以快速定位数据,通过index元数据全部映射到memory,可以避免segment file的IO磁盘操作
在这里插入图片描述

2)异步发送高性能

  Kafka的客户端发送数据到服务器,不是来一条就发一条,消息发送主要是两个线程:一个是Main用户主线程,一个是Sender线程。中间会经过内存缓冲区(默认是16KB),通过KafkaProducer发送出去的消息都是先进入到客户端本地的内存缓冲里,然后把很多消息收集到的Batch里面,再一次性发送到Broker上去的,这样性能才可能提高

  配置一:batch.size

    每个分区未发送消息总字节大小,单位:字节,超过设置的值就会提交数据到服务端,默认值是16KB

  配置二:linger.ms

    默认值就是0,消息是立刻发送的,即便batch.size缓冲空间还没有满,如果想减少请求的数量,可以设置 linger.ms 大于0,即消息在缓冲区保留的时间,超过设置的值就会被提交到服务端;通俗解释是,本该早就发出去的消息被迫至少等待了linger.ms时间,相对于这时间内积累了更多消息,批量发送 减少请求如果batch被填满或者linger.ms达到上限,满足其中一个就会被发送

  1. 零拷贝ZeroCopy(SendFile)

  例子:将一个File读取并发送出去(Linux有两个上下文,内核态,用户态)

  • 传统IO操作File文件的经历了4次copy

  1、调用read,将文件拷贝到了kernel内核态

  2、CPU控制 kernel态的数据copy到用户态

  3、调用write时,user态下的内容会copy到内核态的socket的buffer中

  4、最后将内核态socket buffer的数据copy到网卡设备中传送

  缺点:增加了上下文切换、浪费了2次无效拷贝(即步骤2和3)

  • ZeroCopy零拷贝只需要2次

    1、请求kernel直接把disk的data读取到内存缓冲区2

    2、socket缓冲区传输给网卡,而不是通过应用程序传输

  结论:Zero copy大大提高了应用程序的性能,减少不必要的内核缓冲区跟用户缓冲区间的拷贝,从而减少CPU的开销和减少了kernel和user模式的上下文切换,达到性能的提升,对应零拷贝技术有mmap及sendfile。

  在Kafka、Netty、RocketMQ等中间件里面都采用了零拷贝技术

在这里插入图片描述
4)利用Page cache+mmap

  page cache用于缓存文件的页数据,页是逻辑上的概念,因此page cache是与文件系统同级的;他的作用就是加速数据的IO,写数据的时候首先写入缓存,将写入的页进行标记为dirty,之后向外部存储flush;读数据的时候就先读取缓存,没有读取到再去外部存储读取。page cache中的每个文件都是一棵树,树的每个节点都是一个页。根据文件内的偏移量就可以快速定位到所在的页。


  • kafka高性能总结

  1)存储模型,topic多分区,每个分区多segment段

  2)index索引文件查找,利用分段和稀疏索引

  3)磁盘顺序写入

  4)异步操作少阻塞sender和main线程,批量操作(batch)

  5)页缓存Page cache,没利用JVM内存,因为容易GC影响性能

  6)零拷贝ZeroCopy(SendFile)

  7)更多…

06 进一步延伸

  Kafka除了上述的知识点外,框架本身的设计思想我们就可以借鉴,它里面的话有很多的精髓,我们是可以参考。特别是当我们需要开发一些中间件的时候,就可以参考里面的设计思想,让可以达到事半功倍的效果,

  举个多几个“栗子”,看大家是否可以想到:

    1、Kafak的为什么要设计成Topic下多Partition的模式?我们可以应用在哪里?

    2、消息数据存储在segment文件里面,什么时候会被删除,如果是让你设计会怎么设计?

    3、消费者根据什么模式从broker获取数据的?kafak有多个分区,会从哪个分区进行消费?

    4、kafka 怎么均匀地分配某个 topic 下的所有 partition 到各个消费者,从而使得消息的消费速度达到最快?

    5、一个topic有70个分区,10个消费者,但是先启动一个消费者,后续再启动一个消费者,这个会怎么分配?

    6、当消费者在消费过程突然宕机了,重新恢复后是从哪里消费,会有什么问题

    7、如果保证生产者的消息的可靠性投递到Broker上,你会怎么做

    8、Kafka多副本之间如何保持数据同步?多个副本之间怎么保障数据一致性,你就会怎么设计?

    …

在这里插入图片描述

07 为什么要学习Kafka分布式流处理平台?

  1、多数互联网公司里面用的技术栈,可以承载海量消息处理

  2、三大MQ中间件之一,在多数互联网公司中,Kafka占有率很高,大数据处理领域领头羊

  3、中大型互联网公司-实时计算、离线计算、等基本都离不开Kafka

  4、可以作为公司内部培训技术分享必备知识,可靠性投递、消费、高可用集群等

  5、如果你想成为下面的一种,则这个课程是必备

  针对上面N种知识点,这边推荐一个从0到1讲解大数据高性能分布式流处理平台 Kafka视频,2021年全新录制,采用全新 【Kafka 2.8】版本, 掌握Kakfa核心概念和多种工作模式,点对点/发布订阅模型,生产者、消费者、Broker、Topic、Partition、副本leader/follower等;
  零基础+高可用集群架构,超多Kafka架构+设计思想+底层原理+互联网大厂面试题等

  1)一套让你从小白到高手的Kafa核心应用+内功的视频,总共11章近54集视频,全新2.8版本,全网稀缺资料

  2)课程50多集,每集10~20分钟不等,总时长12小时左右

  3)一天学习4小时,操作3小时,【三天足够掌握 基础+实战+ 高可用+架构原理+面试】

08 学前基础+形式

  1)学习基础:有Linux+SpringBoot基础就行,不会的话我们有对应的专题课程学习,联系客服小姐姐即可

  2)视频讲解➕文字笔记➕原理分析➕交互流程图
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

09 Get It !

  地址链接:https://app8hbvnrpe5761.h5.xiaoeknow.com/v1/goods/goods_detail/p_60c1eb5fe4b07e4d7fddf92a?share_user_id=u_60c849fa6fa92_DT90p1eufB&share_type=5&scene=%E9%82%80%E8%AF%B7%E9%93%BE%E6%8E%A5&sw=1
在这里插入图片描述

以上是关于三天掌握Kafka 消息队列 小白到专家之路!的主要内容,如果未能解决你的问题,请参考以下文章

测开之路七十三:用kafka实现消息队列之环境搭建

物联网架构成长之路(27)-Docker练习之Zookeeper安装

:服务端通用工具第17节:消息队列 - Kafka介绍

必知必会 - 使用kafka之前要掌握的知识

6个步骤,全方位掌握 Kafka

Canal Server发送binlog消息到Kafka消息队列中