这是我参与「第五届青训营」伴学笔记创作活动的第 12 天
今日内容
学习完了青训营课程 后端入门 - 中间件 中的 消息队列前世今生 、 消息队列-Kafka 、 消息队列-BMQ 和 消息队列-RocketMQ 之后的一些总结。
课程内容
- 前世今生
- 消息队列-Kafka
- 消息队列-BMQ
- 消息队列-RocketMQ
1. 前世今生
- 消息队列应对的一些问题以及解决方案:
- 系统崩溃 - 解耦
- 服务处理能力有限 - 削峰
- 链路耗时长尾 - 异步
- 日志处理
- 消息队列需要支持的特性
- 高吞吐
- 高并发
- 高可用
2. 消息队列-Kafka
2.1 使用场景
搜索服务、直播服务、订单服务、支付服务、日志信息、Metrics 数据、用户行为
2.2 如何使用 Kafka
- 创建集群
- 新增 topic
- 编写生产者逻辑
- 编写消费者逻辑
2.3 基本概念
- Topic:逻辑队列,不同 Topic 可以创立不同的 Topic
- Cluster:物理集群,每个集群中可以创建多个不同的 Topic
- Producer:生产者,负责将业务消息发送到 Topic 中
- Consumer:消费者,负责消费 Topic 中的消息
- ConsumerGroup:消费者组,不同组 Consumer 消费进度互不干涉
- Replica:每个分片有多个 Replica,Leader Replica 将会从 ISR(In-Sync Replica) 中选出
2.4 数据复制
2.5 Kafka 架构
2.6 一条消息的自述
Producer->Broker->Consumer
2.7 Producer-数据压缩
Producer 一次发送多条消息,如果每次发送的消息过大可能导致带宽不够。此时可以通过压缩,减少消息大小,目前支持 Snappy、Gzip、LZ4、ZSTD 压缩算法。
2.8 Broker-数据的存储
消息文件结构
如何找到消息
Consumer 通过发送 FetchRequest 请求消息数据,Broker 会将指定 Offset 处的消息按照时间窗口和消息大小窗口发送给 Consumer。
2.9 Consumer-消息的接收端
2.10 Consumer Rebalance
帮助 Kafka 提高吞吐或者稳定性的功能
- Producer:批量发送、数据压缩
- Broker:顺序写,消息索引,零拷贝
- Consumer:Rebalance
2.11 Kafka-数据复制问题
2.12 Kafka-重启操作
2.13 Kafka-替换、扩容、缩容
2.14 Kafka-负载不均衡
问题总结
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖 Page Cache
- Controller 和 Coordinator 和 Broker 在同一进程中,大量 IO 会造成性能下降
3. 消息队列-BMQ
3.1 BMQ 简介
兼容 Kafka 协议、存算分离、云原生消息队列
3.2 运维操作对比
| 具体操作 | Kafka | BMQ |
|---|---|---|
| 重启 | 需要数据复制,分钟级重启 | 重启后可直接对外服务,秒级完成 |
| 替换 | 需要数据复制,分钟级替换,甚至天级别 | 替换后可直接对外服务,秒级完成 |
| 扩容 | 需要数据复制,分钟级扩容,甚至天级别 | 扩容后可直接对外服务,秒级完成 |
| 缩容 | 需要数据复制,分钟级缩容,甚至天级别 | 缩容后可直接对外服务,秒级完成 |
3.3 HDFS 写文件流程
3.4 BMQ 文件结果
3.5 Broker-Partition 状态机
写文件流程
3.6 Proxy
3.7 多机房部署
3.8 BMQ-高级特性
3.9 泳道消息
开发流程:开发->BOE->PPE->Prod
BOE:Bytedance Offine Environment,是一套完全独立的线下机房环境
PPE:Product Preview Environment,即产品预览环境
3.10 Databus
- 简化消息队列客户端复杂度
- 解耦业务与 Topic
- 缓解集群压力,提高吞吐
3.11 Mirror
3.12 Index
3.13 Parquet
Apache Parquet 是 Hadoop 生态圈中一种新型列式存储格式,它可以兼容 Hadoop 生态圈中大多数计算框架(Hadoop,Spark 等),被多种查询引擎支持。
小结
- BMQ 的框架模型(解决 Kafka 存在的问题)
- BMQ 读写流程(Failover 机制,写入状态机)
- BMQ 高级特性(泳道、Databus、Mirror、Index、Parquet)
4. 消息队列-RocketMQ
使用场景:针对电商业务,其业务涉及广泛,如注册、订单、库存、物流等;同时,也会设计许多业务峰值时刻,如秒杀活动,周年庆,定期特惠等等。