这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
消息队列
基本概念
- 消息队列,指保存消息的一个容器,本质是个队列,但是这个队列,需要支持高吞吐、高并发、并且高可用
业界消息队列对比
- Kafka:分布式的,分区的,多副本的日志提交服务,在高吞吐场景下发挥较为出色
- RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可拓展性,在一些实时场景中运用较广
- Pulsar:下一代云原生分布式消息流平台,集消息、存储、轻量化函数实计算为一体、采用存算分离的架构设计
- BMQ:和 Pulsar 架构类似,存算分离,初期定位时承接高吞吐的离线业务场景,逐步替换掉对应的 Kafka 集群
Kafka
适用场景
- 搜索服务
- 直播服务
- 订单服务
- 支付服务
如何适用 Kafka
- 创建集群
- 新增 Topic
- 编写生产者逻辑
- 编写消费者逻辑
基本概念
- Topic:逻辑队列,不同 Topic 可以创建不同的 Topic
- Cluster:物理集群,每个集群中可以创建多个不同的 Topic
- Producer:生产者,负责将业务消息发送到 Topic 中
- Consumer:消费者,负责消费 Topic 中的消息
- ConsumerGroup:消费者组,不同组 Consumer 消费进度互不干涉
- Offset:消息在 partion 内的相对位置信息,可以理解为唯一 ID,在 partition 内部严格递增
- Replica:每个分片有多个 Replica,Leader Replica 将会从 ISR 中选出
Producer
批量发送
- 可以减少 IO 次数,从而加强发送能力
数据压缩
- 通过压缩,减少消息大小,目前支持 Snappy、Gzip、LZ4、ZSTD 压缩算法
Broker
磁盘结构
- 移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入,训导成本比较高,因此顺序写可以减少训导所带来的时间成本
顺序写
- 采用顺序写的方式进行写入,以提高写入效率
如何找到消息
- Consumer 通过发送 FetchRequest 请求消息数据,Broker 会将指定 Offset 处的消息,按照时间窗口和消息大小窗口发送给 Consumer
偏移量索引文件
- 二分找到小于目标 offset 的最大文件
时间戳索引文件
- 二分找到小于目标时间戳最大的索引位置,在通过寻找 offset 的方式找到最终数据
Consumer
Low Level
- 通过手动进行分配,哪一个 Consumer 消息哪一个 Partition 完全由业务来决定
High Level
Rebalance
重启操作
- 关闭、重启
- Leader 切换,追赶数据
- 数据同步完成
- Leader 回切
BMQ
简介
- 兼容 Kafka 协议,存算分离,云原生消息队列
运维操作对比
| 具体操作 | Kafka | BMQ |
|---|---|---|
| 重启 | 需要数据复制,分钟级重启 | 重启后可直接对外服务,秒级完成 |
| 替换 | 需要数据复制,分钟级替换,甚至天级别 | 替换后可直接对外服务,秒级完成 |
| 扩容 | 需要数据复制,分钟级扩容,甚至天级别 | 扩容后可直接对外服务,秒级完成 |
| 缩容 | 需要数据复制,分钟级缩容,甚至天级别 | 缩容后可直接对外服务,秒级完成 |
Broker - Partition 状态机
- 保证对于任意分片在同一时刻只能在一个 Broker 上存活
泳道消息
开发流程
- 开发
- BOE
- PPE
- Prod
BOE
- 一套完全独立的线下机房环境
- 多个人同时测试,需要等待上一个人测试完成
- 每多一个测试人员,都需要重新搭建一个相同配置的 Topic,造成人力和资源的浪费
PPE
- 产品预览环境
- 对于 PPE 的消费者来说,资源没有生产环境多,所以无法承受生产环境的流量
Databus
直接适用原生 SDK 的问题
- 客户端配置较为复杂
- 不支持动态配置,更改配置需要停止服务
- 对于 latency 不是很敏感的业务,batch 效果不佳
解决
- 简化消息队列客户端复杂度
- 解耦业务与 Topic
- 缓解集群压力,提高吞吐
Mirror
- 使用 Mirror 通过最终一致的方式,解决跨 Region 读写问题
Index
- 直接在 BMQ 中将数据结构化,配置索引 DDL,异步构建索引后,通过 Index Query 服务读出数据
Parquet
- Apache Parquet 是 Hadoop 生态圈中一种新型列式存储格式,它可以兼容 Hadoop 生态圈中大多数计算框架(Hadoop、Spark 等),被多种查询引擎支持(Hive、Impala、Drill等)
- 直接在 BMQ 中将数据结构化,通过 Parquet Engine,可以使用不同的方式构建 Parquet 格式文件
RocketMQ
基本概念
| 名称 | Kafka | RocketMQ |
|---|---|---|
| 逻辑队列 | Topic | Topic |
| 消息体 | Message | Message |
| 标签 | 无 | Tag |
| 分区 | Partition | CunsumerQueue |
| 生产者 | Producer | Producer |
| 生产者集群 | 无 | Producer Group |
| 消费者 | Consumer | Consumer |
| 消费者集群 | Consumer Group | Consumer Group |
| 集群控制器 | Controller | Nameserver |
高级特性
-
事务场景
- 最终一致性
-
事务消息
-
延迟发送
-
延迟消息
-
处理失败
-
消息重试和死信队列