青训营笔记|消息队列
前提引入
问题:
- 删库跑路。系统崩溃
- 服务处理能力有限
- 服务连服耗时长
- 日志如何处理
解决方法
- 引入信息队列,解耦。
- 引入信息队列,削峰。
- 引入信息队列,异步处理。
- 引入信息队列,日志处理。
概念
信息队列(MQ):保存信息的一个容器,本质是个队列,该队列需要支持高吞吐,高并发,并且高可用。
业界消息队列
- Kafka
- RocketMQ
- Pulsar
- BMQ
Kafka
使用 Kafka
- 创建集群
- 新增 Topic,设置分片数量
- 引入对应语言 SDK,配置参数,编写生产者逻辑
- 引入对应语言 SDK,配置参数,编写消费者逻辑
基本概念
- Topic:逻辑队列,业务场景-topic
- Cluster:物理集群,集群中可以新建多个不同的 topic
- Producer:生产端,发送业务信息到 topic 中
- Consumer:消费端,消费已经发送到 topic 中的信息
- Partition:topic 中有多个分片,不同分片信息可以并发处理。
- Offset:消息在 partition 内的相对位置,唯一 ID。
- Replica::分片的副本,每个分片有多个 Replica,其中 Leader 对外服务,Follower 同步 Leader 数据(副本)。
- ISP:同步中的副本,在 ISP 中的副本可以提升为 Leader
- Broker:Kafka 的节点,所有的 Broker 节点组成一个集群。
- Controller:负责对副本和 Broker 进行分配
- ZooKeeper:集群的基础上,模块,这个模块储存了集群的元数据信息,包括分区分配信息等。
Kafka 过程
Producer
- 批量发送
- 数据压缩
Broker数据存储
- Topic
-
- Partition
-
- Replica
-
- Log
-
- LogSegment
-
- .log(日志文件)
- .index
- .timeindex
- 其他文件
顺序写入
Broker 数据查找
- offset 索引,二分找到小于目标 offset 的最大索引位置,再遍历找到目标 offset
- 若是时间戳索引,通过二分找到时间戳对应的 offset 重复以上步骤
Broker传统数据拷贝与零拷贝
详情见 ppt
Consumer 与 Partition 分配问题
- 手动分配(Low Level)
- 自动分配(High Level)
在 Broker 集群中,对于 Consumer Group 来讲,选取 一台 Broker 作为 coordinator,coordinator 帮助 Consumer Group 进行分片的分配(rebalance)
Kafka数据复制问题
Kafka重启
首先 leader发生切换,切换到其他节点上的并且在 ISR 上的Follower副本,在进行关闭重启操作中,存在数据的滞后,新的 Broker 追赶数据,避免leader分布在少数的 Broker 上,要进行leader 的回切。
Kafka替换,扩容,缩容
替换:本质上是需要更多数据的重启操作。
扩容:分片分配到新的 Broker 上,从新复制新的副本
缩容:缩容节点上的分片分配到Broker中的剩余节点,从新复制新的副本
Kafka负载不均衡
需要权衡IO 设计出极其复杂的负载均衡策略
Kafka问题总结
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有缓存,完全依赖 page cache
- Controller、coordinator、Broker 在同一进程