这是我参与「第五届青训营 」伴学笔记创作活动的第15天。
0、重点
- 消息队列
- Kafka
- BMQ
- RocketMQ
1、消息队列
1.1 什么是消息队列
消息队列(MQ),指保存消息的一个容器,本质是一个队列。但这个队列需要支持高吞吐,高并发并且高可用。
1.2 发展历程
业界消息队列对比
- Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色
- RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广
- Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计
- BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群
2、Kafka
2.1 使用场景
- 搜索服务
- 直播服务
- 订单服务
- 支付服务
2.2 如何使用
graph TD
创建集群 --> 新增topic --> 编写生产者逻辑 --> 编写消费者逻辑
2.3 基本概念
-
Topic
-
Cluster
-
Producer
-
Consumer
-
ConsumerGroup
-
Offset
- 消息在partition内的相对位置信息,可理解为唯一ID,在partition内部严格递增
-
Replica
- 每个分片有多个Replica,Leader Replica会从ISR中选出
2.4 数据复制
2.5 Kafka架构
ZooKeeper:负责存储集群元信息,包括分区分配信息等
2.6 思考
2.7 Producer
2.8 Broker
- 消息文件结构
-
磁盘结构
- 移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入。寻道成本比较高,因此顺序写可以减少寻道所带来的时间成本。
2.9 Consumer
上述可以帮助Kafka提高吞吐或者稳定性的功能有
- Producer:批量发送、数据压缩
- Broker:顺序写、消息索引、零拷贝
- Consumer:Rebalance
Kafka问题总结
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖Page Cache
- Controller和Coordinator在同一进程中,大量IO会造成其性能下降
3、BMQ
3.1 BMQ文件结构
3.2 Broker
- 写文件流程
- BMQ的架构模型(解决Kafka存在的问题)
- BMQ读写流程(Failover机制,写入状态机)
- BMQ高级特性(泳道、Databus、Mirror、Index、Parquet)
4、RocketMQ
4.1 基本概念
| 名称 | Kafka | RocketMQ |
|---|---|---|
| 逻辑队列 | Topic | Topic |
| 消息体 | Message | Message |
| 标签 | 无 | Tag |
| 分区 | Partition | ConsumerQueue |
| 生产者 | Producer | Producer |
| 生产者集群 | 无 | ProducerGroup |
| 消费者 | Consumer | Consumer |
| 消费者集群 | ConsumerGroup | ConsumerGroup |
| 集群控制器 | Controller | Namesever |
4.2 RocketMQ的高级特性
事物场景
事物消息
延迟发送
延迟消息
处理失败
消费重试和死信队列
- RocketMQ的基本概念(Queue、Tag)
- RocketMQ的底层原理(架构模型、存储模型)
- RocketMQ的高级特性(事物消息、重试和死信队列、延迟队列)