这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
本文是我在学习青训营课《走进消息队列》的过程中记的笔记,只是随手记的一些笔记,后面全是流程图讲解,实在跟不上记了
消息队列(MQ),指保存消息的一个容器,本质是个队列。但这个队列呢,需要支持高吞吐,高并发,并且高可用。
消息队列-Kafka
使用场景
- 搜索服务
- 直播服务
- 订单服务
- 支付服务
如何使用Kafka
graph TD
创建集群 --> 新增Topic --> 编写生产者逻辑 --> 编写消费者逻辑
基本概念
- Topic:Kakfa中的逻辑队列,可以理解成每一个不同的业务场景就是一个不同的topic,对于这个业务来说,所有的数据都存储在这个topic中
- Cluster:Kafka的物理集群,每个集群中可以新建多个不同的topic
- Producer:顾名思义,也就是消息的生产端,负责将业务消息发送到Topic当中
- Consumer:消息的消费端,负责消费已经发送到topic中的消息
- Partition:通常topic会有多个分片,不同分片直接消息是可以并发来处理的,这样提高单个Topic的吞吐
- Offset : 消息在 partition 内的相对位置信息,可以理解为唯一ID,在 partition 内部严格递增。
- Replica:分片的副本,分布在不同的机器上,可用来容灾,Leader对外服务,Follower异步去拉取leader的数据进行一个同步,如果leader挂掉了,可以将Follower提升成leader再堆外进行服务
- ISR:意思是同步中的副本,对于Follower来说,始终和leader是有一定差距的,但当这个差距比较小的时候,我们就可以将这个follower副本加入到ISR中,不在ISR中的副本是不允许提升成Leader的
每个分片有多个 Replica,Leader Replica 将会从 ISR 中选出。
一条消息的处理流程
graph TD
Producer --> Broker --> Comsumer
Broker代表每一个Kafka的节点
Producer
批量发送
批量发送可以减少IO次数,从而加强发送能力
stateDiagram-v2
Producer --> Batch
Batch --> Broker
Broker --> Success
Success --> Producer
数据压缩
通过压缩,减少消息大小,目前支持Snappy、Gzip、LZ4、ZSTD压缩算法
stateDiagram-v2
Producer --> Batch
Batch --> 压缩
压缩 --> Broker
Broker --> Success
Success --> Producer
Broker
顺序写
Broker采取顺序写的方式,提高写入效率
消息索引
- 偏移量索引文件:二分找到小于目标offset的最大索引位置,再遍历找到目标offset
- 时间戳索引文件:二分找到小于目标时间戳最大的索引位置,再通过寻找 offset 的方式找到最终数据。