这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
使用场景
搜索服务、直播服务、订单服务、支付服务 --> 搜索、点赞、评论、收藏
如何使用Kafka
- 创建集群:首先需要创建一个Kafka集群
- 新增 Topic:需要在这个集群中创建一个Topic,并且设置好分片数量
- 编写生产者逻辑:引入对应语言的SDK,配置好集群和Topic等参数,初始化一个生产者,调用Send方法,将Hello World 发送出去
- 编写消费者逻辑:引入对应语言的SDK,配置好集群和Topic等参数,初始化一个消费者,调用Poll方法,将收到刚刚发送的Hello World
基本概念
- topic:Kafka中的逻辑队列,可以理解成每一个不同的业务场景就是一个不同的topic,对于这个业务来说,所有的数据都存储在这个topic中
- Cluster:Kafka的物理集群,每个集群中可以新增多个不同的topic
- Producer:顾名思义,也就是消息的生产端,负责将业务消息发送到Topic当中
- Consumer:消息的消费端,负责消费已经发送到topic中的消息
- Partition:通常topic会有多个分片,不同分片直接消息是可以并发来处理的,这样提高单个Topic的吞吐
基本概念-Offset
Offset:消息在partition内的对位置信息,可以理解为唯一ID,在partition内部严格递增
基本概念-Replica
每个分片有多个Replica,Leader Replica 将会从ISR中选出
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进行分配。
Kafka 架构
Producer-数据压缩
通过压缩,减少消息大小,目前支持Snappy、Gzip、LZ4、ZSTD压缩算法
Broker-如何找到消息
Consumer通过发送FetchRequest请求消息数据,Broker会将制定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer,
Broker-零拷贝
Consumer从Broker中读取数据,通过sendfile的方式,将磁盘读到os内核缓冲区后,直接转到socket buffer进行网络发送。
Producer生产的数据持久化到broker,采用mmap文件映射,实现顺序的快速写入
Consumer-High Level
Kafka提供自动分配的方式,也叫High Level的消费方式,简单的来说,就是在我们的Broker集群中,对不同的Consumer Group来讲,都会选取一台Broker当做Coordinator,而Coordinator的作用就是帮助Consumer Group进行分片的分配,也叫做分片的rebalance,使用这种方式,如果ConsumerGroup中有发生宕机,或者有新的Consumer加入,整个partition和Consumer都会重新进行分配来达到一个稳定的消费状态。