这是我参与「第三届青训营 -后端场」笔记创作活动的的第16篇笔记
- 背景
- 场景
- 系统崩溃
- 服务处理能力有限
- 链路耗时长尾
- 日志如何处理
- 解决方案
- 解耦
- 削峰
- 异步
- 场景
- 消息队列
- 保存消息的一个容器,本质是个队列,需要支持高吞吐,高并发,高可用
- 常用消息队列
- Kafka
- 分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色
- RocketMQ
- 低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广
- Pulsar
- 下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用存算分离的架构设计
- BMQ
- 和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群
- Kafka
- Kafka
- 基本概念
- Topic
- 逻辑队列,不同Topic可以建立不同的partition
- Cluster
- 物理集群,每个集群中可以建立多个不同的Topic
- Producer
- 生产者,负责将业务消息发送到Topic中
- Consumer
- 消费者,负责消费Topic中的消息
- ConsumerGroup
- 消费者组,不同组Consumer消费进度互不干涉
- Offset
- 消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增
- Replica
- 每个分片有多个Replica(副本),Leader Replica将会从ISR(In-Sync Replicas)中选出
- Topic
- 架构
- ZooKeeper
- 负责存储集群元信息,包括分区分配信息
- Producer
- 批量发送
- 可以减少IO次数,从而加强发送能力
- 数据压缩
- 通过压缩,减少消息大小,目前支持Snappy,Gzip,LZ4,ZSTD压缩算法
- 批量发送
- Broker-数据存储
- 消息文件结构
- Topic-Partition-Replica-Log-LogSegment
- .log 日志文件
- .index 偏移量索引文件
- .timeindex 时间戳索引文件
- 其他文件
- Topic-Partition-Replica-Log-LogSegment
- 磁盘结构
- 移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入,寻道成本比较高,因此顺序写可以减少寻道所带来的时间成本
- 顺序写
- 采用顺序写的方式进行写入,提高写入效率
- 消息文件结构
- Broker-找到消息
- Consumer通过发送FetchRequest请求消息数据,Broker将会指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer
- 偏移量索引文件
- 二分找到小于目标offset的最大文件
- 二分找到小于目标offset的最大索引位置
- 时间戳索引文件
- 二分找到小于目标时间戳最大的索引位置,在通过寻找offset的方式找到最终数据
- Broker-零拷贝
- 不需要从内核态转换到用户态
- Consumer
- 消息的接收
- Low Level
- 通过手动进行分配,哪一个Consumer消费哪一个Partition完全由业务来决定
- 缺点
- 不能容灾
- High Level
- 选取一个broker当coordinator协调者
- Consumer Rebalance
- Low Level
- 消息的接收
- ZooKeeper
- 帮助kafka提高稳定性的功能
- Producer
- 批量发送
- 数据压缩
- Broker
- 顺序写
- 消息索引
- 零拷贝
- Consumer
- Rebalance
- Producer
- 问题总结
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖Page Cache
- Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降
- 基本概念
- BMQ
- 兼容Kafka协议,存算分离,云原生消息队列
- HDFS写文件流程
- 随机选择一定数量的DataNode进行写入
- Broker-Partition状态机
- 保证对于任意分片在同一时刻只能在一个Broker上存活
- Broker
- 写文件Failover
- 如果DataNode节点挂了或者是其他原因导致写文件失败,随机选择另一可用节点写入
- 写文件Failover
- 泳道消息
- 解决主干泳道流量隔离问题以及泳道资源重复创建问题
- Databus
- 简化消息队列客户端复杂度
- 解耦业务与Topic
- 缓解集群压力,提高吞吐
- Mirror
- 解决跨域读写
- Index
- 在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据
- Parquet
- 在BMQ中将数据结构化,通过Parquet Engine,可以使用不同方式构建Parquet格式文件
- RocketMQ
- 高级特性
- 事务场景
- 延迟发送
- 消费重试和死信队列
- 高级特性