消息队列 Kafka | 青训营笔记

39 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

使用场景

搜索服务、直播服务、订单服务、支付服务 --> 搜索、点赞、评论、收藏

如何使用Kafka

  1. 创建集群:首先需要创建一个Kafka集群
  2. 新增 Topic:需要在这个集群中创建一个Topic,并且设置好分片数量
  3. 编写生产者逻辑:引入对应语言的SDK,配置好集群和Topic等参数,初始化一个生产者,调用Send方法,将Hello World 发送出去
  4. 编写消费者逻辑:引入对应语言的SDK,配置好集群和Topic等参数,初始化一个消费者,调用Poll方法,将收到刚刚发送的Hello World

基本概念

2.jpg

  • topic:Kafka中的逻辑队列,可以理解成每一个不同的业务场景就是一个不同的topic,对于这个业务来说,所有的数据都存储在这个topic中
  • Cluster:Kafka的物理集群,每个集群中可以新增多个不同的topic
  • Producer:顾名思义,也就是消息的生产端,负责将业务消息发送到Topic当中
  • Consumer:消息的消费端,负责消费已经发送到topic中的消息
  • Partition:通常topic会有多个分片,不同分片直接消息是可以并发来处理的,这样提高单个Topic的吞吐

基本概念-Offset

Offset:消息在partition内的对位置信息,可以理解为唯一ID,在partition内部严格递增

3.jpg

基本概念-Replica

每个分片有多个Replica,Leader Replica 将会从ISR中选出

4.jpg

Replica:分片的副本,分布在不同的机器上,可用来容灾,Leader对外服务,Follower异步拉取leader的数据进行一个同步,如果leader挂掉了,可以将Follower提升成leader再推外进行服务。

ISR:意思是同步中的副本,对于Follower来说,始终和leader是有一定差距的,但当这个差距比较小的时候,我们就可以将这个follower副本加入ISR中,不在ISR中的副本是不允许提升成Leader的。

数据复制

图代表Kafka中副本的分布图。图中Broker代表每一个Kafka的节点,所有的Broker节点最终组成了一个集群。图中整个集群包含了4个Broker机器节点,集群有两个Topic,分别是Topic1和Topic2,Topic1有两个分片,Topic2有1个分片,每个分片都是三副本的状态。这里中间有一个Broker同时也扮演了Controller的角色,Controller是整个集群的大脑,负责对副本和Broker进行分配。

5.jpg

Kafka 架构

6.jpg

Producer-数据压缩

通过压缩,减少消息大小,目前支持Snappy、Gzip、LZ4、ZSTD压缩算法

Broker-如何找到消息

Consumer通过发送FetchRequest请求消息数据,Broker会将制定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer,

Broker-零拷贝

Consumer从Broker中读取数据,通过sendfile的方式,将磁盘读到os内核缓冲区后,直接转到socket buffer进行网络发送。

Producer生产的数据持久化到broker,采用mmap文件映射,实现顺序的快速写入

7.jpg

Consumer-High Level

8.jpg

Kafka提供自动分配的方式,也叫High Level的消费方式,简单的来说,就是在我们的Broker集群中,对不同的Consumer Group来讲,都会选取一台Broker当做Coordinator,而Coordinator的作用就是帮助Consumer Group进行分片的分配,也叫做分片的rebalance,使用这种方式,如果ConsumerGroup中有发生宕机,或者有新的Consumer加入,整个partition和Consumer都会重新进行分配来达到一个稳定的消费状态。