美文网首页
软件篇-kafka(一)-简介及原理介绍

软件篇-kafka(一)-简介及原理介绍

作者: 秃头猿猿 | 来源:发表于2021-05-09 16:32 被阅读0次

部分内容参考:《kafka 权威指南》

1.发布订阅

1.1 前言

总所周知,kafka是一个基于发布订阅模式的中间件,因此要想学习kafka,先学习一下发布订阅模式。

1.2 介绍

发布订阅

image-20210509124456808

简而言之就是,发布订阅模主要存在两个角色:

  • 发布者
  • 订阅者

发布者也叫消息的发送者,或者说叫消息的生产者,主要是用来生产消息和发送消息

生产者当生产完消息之后并不会直接把消息发送给消息的接收方,而是按照消息的类别发送到一个中间件里面

订阅者可以从中从中间件中接收感兴趣的消息,一旦发布者再次往中间件中发送消息,订阅者就会及时收到消息

image-20210509125650345

真实例子

例如:现实生活中的订报纸,一般订报纸存在三种事务

  • 报社
  • 阅读者
  • 报纸

报社(生产者)制造报纸内容,并且生产报纸(消息),当报纸生产完了交给邮局(中间件),邮局并不是把所有的报纸发给所有的人

邮局会把不同类型的报纸主动推送给向邮局订阅了的对应类型的阅读者(消费者)。一旦报社生产新的报纸,邮局还是会主动推送给阅读者,直到阅读者不再订阅。

image-20210509130403528

模式优点

通过上述例子知道,发布订阅模式,通过一个中间件来解决生产者和消费者的耦合问题

如果没有中间件,生产者就会直接把消息发送给消费者,有了中间件,两者不直接通讯,从而达到了解耦

image-20210509130958544

通过上图可知,这种模式工作原理如下:

  • N个生产者在生产消息,同时N个消费者在消费消息,相互不通信而是中间件进行通信
  • 生产者负责向中间件添加消息
  • 消费者负责向中间件消费消息

一般来说中间件都是用队列来进行存储消息,因此消费消息也遵循先进先出的原理


中间件

中间件的作用有很多,大体如下:

  • 生产者和消费者进行解耦

  • 并发和忙先不均支持

    消费者消费消息很慢,而生产者生产消息又很快,那么有了中间件以后

    就可以同时启动多个消费者去进行消费.

    同时未被消息的消息还会存储在中间件上,等生产者速度慢下来,消费者再去消费消息

当然向这种中间件称为消息中间件,市面上也有很多这样的消息中间件,例如:kafka,RabbitMQ,RocketMQ

在这里主要阐述kafka,如果想要了解其他中间件可以参考这个地址

2.kafka介绍

2.1 历史

kafka是一个由scalajava语言编写的一个高吞吐量的分布式发布订阅系统

官网地址:http://kafka.apache.org/

image-20210509134937788

kafka最初使用场景就是一个日志系统,用来跟踪用户在网站的活动,例如,页面的访问次数和点击量或者是复杂的一些操作。这些操作记录下来,并且发送到kafka,后端负责读取数据,·生成报告,为机器学习提供数据

2010年底宣布在GitHub上作为开源项目进行发布,现在kafka被很多组织用在了一些大型数据管道上

2.2 架构

在安装kafka之前先来了解一些关于kafka的一些架构,之后再去安装,会更加清楚

kafka大体架构如下:

image-20210509144747957

关于架构图的解释如下:

  • Broker

    • kafka集群包含一个或者多个节点,每个节点称为broker
    • broker是无状态的,因此需要通过zookeeper来维护集群状态
    • 一个broker可以每秒可以处理数十万次读写,且每个broker都可以处理TB级别的消息而不影响性能
  • Topic

    每个发布到kafka的消息都会有一个类别,类似于ElasticSearchIndex概念

    实际上每个topic消息是分开存储的,当在kafka去创建topic时,需要去指定partion(分区),不同的分区存储同种类型的不同消息

    默认存储消息的时间为七天

  • Partion

    每个topic都会有分区,类似于ElasticSearch的索引分片原理,例如一个topic里面有1000个消息,而这个topic有4个分区,那就根据其自身的算法将1000个消息平均分割存储在四个分区上,如下

    image-20210509150427468
    • 每个topic至少会分割一个或者多个partion

    • 当生产者向中间件发送数据时,会根据分配策略,选择partion,然后将消息追加到partion末尾

      从这句话可以看出partion的原理其实就是一个队列

    • 每个消息在partion都会有自己自增的标号

      该标号的作用用来标识消息的顺序

      同时用于标识消息的偏移量

      例如,当在一个partion上消费了五条消息,当下次消费时就是从第六个消息开始消费,这个五就是偏移量

    • 每个partion使用多个segment文件存储数据

    • 在一个partion中,消息数据是有序的,不同的partion中的数据是无需的

      如果想要保证kafka里面topic消息的有序性,那么就可以把该 partion设为1

  • Leader

    • 为了保证数据的安全行,每个partion都会有其副本,其中只有一个会成为leader(主),其他的会成为从follower(从)

    • leader是负责数据的读写的partion

  • Follower

    • follower不具备读写能力,只负责备份,这样就可以保证数据的一致性

    • 所有的请求都是由leader完成,当leader完成数据的变更操作时,就会广播给所有的follower,然后follower就会复制leader变更的数据,从而保持同步

    • 当然如果leader挂掉以后,则从follower中从新选取一个新的leader

    • 当然如果follower挂掉或者卡住,同步太慢,leader就会从ISR列表中删除,重新创建一个follower

      关于ISR解释请参考这个地址

      image-20210509160013583

      注意:

      为了保证数据的安全性,kafka集群会保证同一个topic的不同分区散落在不同的broker上,具体策略如下:

      假设由Nbroker

      第 i 个 partion 分配到 (i mod n) 个 broker

  • replication

    • 如果partion损坏时,数据就会丢失,因此需要对数据进行备份,也就是设置partion的replicatoin(副本)数字

    • 一个分区可以有多个副本,当然kafka也不会让partion和他们的副本在一个broker上,因此也会散落在不同的broker

      具体策略如下:

      假设由Nbroker

      第 i 个 partion 分配到 (i mod n)broker

      第 i 个 partion的 j 个 副本 分配到 (i + j) mod nbroker

  • producer

    • 数据的发布者,主要发布消息到kafkatopic
    • broker接受到消息后,会将当前的消息追加到当前用于追加数据的segment文件中
    • 发布者不需要指定发布到topic的那个分区上,topic会根据规则自动将消息分配到某个分区上,当然也可以指定数据存储的partion
  • consumer

    • 消费者可以从broker中消费数据,同时一个消费者可以消费多个topic中的数据
  • consumer group

    • 每个消费者都属于一个消费者组,一个消费者组可以拥有多个消费者,

      一个消费者组对一个topic里面的消费消息只能读取一次

      当消息太多,消费者消费消息时间太长,那么就会造成阻塞,有了消费组以后

      就可以往组里面增加多个消费者同时消费一个topic消息,这样就会提高速度

  • offset

    image-20210509162125111
    • offset记录着下一次消费者消费消息的序号,消费者通过偏移量来决定下次读取的消息
    • 之前旧版本是将offset存储在zookeepr中,新版本则是存储在kafka
    • 一个分区中,消息是按照顺序存储,每隔消息都有一个自增的id,这个id就是偏移量
    • 消息被消费后不回立马删除,而是默认保存七天,这样很多业务可以重复读取kafka的数据
    • 如果用户想要重复消费某个消息,那么可以控制偏移量来达到重复消费消息的功能
  • zookeeper

    • kafka是通过zookeeper来存储集群的元数据信息,例如topic的数量多少,partion多少等等数据

    当然kafka也在想办法对zookeeper进行剥离,因为维护两套集群成本较高

相关文章

  • 软件篇-kafka(一)-简介及原理介绍

    部分内容参考:《kafka 权威指南》 1.发布订阅 1.1 前言 总所周知,kafka是一个基于发布订阅模式的中...

  • Kafka 原理介绍及安装部署

    Kafka 原理介绍及安装部署 标签:kafka 安装 简介 Kafka 是 Linkedin 于 2010 年 ...

  • [Kafka 101-0] Kafka简介

    Kafka 101系列第一篇:Kafka简介。 我们看看Kafka官网的自我介绍: Kafka® is used ...

  • Kafka系列一- Kafka背景及架构介绍

    Kafka系列一- Kafka背景及架构介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统。...

  • kafka手记

    参考 Kafka文件存储机制那些事 kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)zookee...

  • kafka学习系列

    Kafka学习总结(一)——Kafka简介 Kafka学习总结(二)——Kafka设计原理 Kafka学习总结(三...

  • InheritableThreadLocal详解

    1、简介 在上一篇 ThreadLocal详解 中,我们详细介绍了ThreadLocal原理及设计,从源码层面上分...

  • Kafka consumer 解析

    上一篇说了Kafka consumer的处理逻辑、实现原理及相关的特点,本篇来看看Kafka 另一个client ...

  • kafka

    一、什么是Kafka1、kafka简介 2、kafka基本架构 二、kafka原理 三、Zookeeper在kaf...

  • Kafka

    一、什么是Kafka1、kafka简介 2、kafka基本架构 二、kafka原理 三、Zookeeper在kaf...

网友评论

      本文标题:软件篇-kafka(一)-简介及原理介绍

      本文链接:https://www.haomeiwen.com/subject/nlxvdltx.html