[ 后端与 Go | 青训营笔记 ]
这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
课内:Go 走进消息队列
消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:. 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。. 消息队列主要解决了应用耦合、异步处理、流量削锋等问题。. 当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如 Redis 、Mysql以及phxsql也可实现消息队列的功能。
重点
- 背景;
- 消息队列 - Kafka;
- 消息队列 - BMQ;
- 消息队列 - RocketMQ;
细节
背景
消息队列 - Kafka
发展历程
对比
- Kafka;
- RocketMQ;
- Pulsar;
- BMQ;
消息队列 - Kafka
使用场景
- 搜索服务;
- 直播服务;
- 订单服务;
- 支付服务;
使用
- 创建集群;
- 新增 Topic;
- 编写生产者逻辑;
- 编写消费者逻辑;
基本概念
- Topic:逻辑队列,不同 Topic 可以建立不同的 Topic;
- Cluster:物理集群,每个集群中可以建立多个不同的 Topic;
- Producer:生产者,发展将业务消息发送到 Topic 中;
- Consumer:消费者,负责消费 Topic 中的消息;
- ConsumerGrou:消费者组,不同组 Consumer 消费进度互不干涉;
Offset
- 消息在 partition 内的相对位置信息,可以理解为唯一 ID,在 partition 内部严格递增;
Replica
- 每个分片有多个 Replica,Leader Replica 将会从 ISR 中选出;
数据复制
Kafka 架构
ZooKeeper
- 负责存储集群元信息,包括分区分配信息等;
Producer
批量发送
数据压缩
- 通过压缩,减少消息大小;
Broker
数据存储
消息文件结构
磁盘结构
顺序写
- 提高写入效率;
搜索消息
偏移量索引文件
- 二分找到小于目标 offset 的最大文件;
时间戳索引文件
- 二分找到小于目标时间戳最大的索引位置,在通过寻找 offset 的方式找到最终数据;
传统数据拷贝
零拷贝
Consumer
消息的接收端
Low Level
- 通过手动分配,哪一个 Consumer 消费哪一个 Partition 完全由业务来决定;
High Level
Rebalance
数据复制问题
重启操作
替换、扩容、缩容
负载不均衡
问题总述
- 运维成本高;
- 对于负载不均衡的场景,解决方案复杂;
- 没有自己的缓存,完全依赖 Page Cache;
- Controller 和 Coordinator 和 Broker 在同一进程中,大量 IO 会导致其性能下滑;
消息队列 - BMQ
介绍
运维操作对比
HDFS 写文件流程
文件结构
Broker
Partition 状态机
写文件流程
写文件 Failover
Proxy
多机房部署
高级特性
泳道消息
开发流程
- BOE;
- PPE;
BOE 测试
- 多个人同时测试,需要等待上一个人测试完成;
PPE 验证
Databus
- 简化消息队列客户端复杂度;
- 解耦业务与 Topic;
- 缓解集群压力,提高吞吐;
Mirror
Index
Parquet
消息队列 - RocketMQ
使用场景
基本概念
架构
存储模型
高级特性
事务场景
事务消息
延迟发送
延迟消息
处理失败
消费重试与死信队列
总结
对消息队列有了一定的了解。