这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
消息队列
什么是消息队列
消息队列(MQ),指保存消息的一个容器,本质是个队列,但这个队列呢,需要支持高吞吐,高井发,并且高可用。
Kafka
使用场景
- 日志信息
- Metrics 数据
- 用户行为
如何使用 Kafka
创建集群 -> 新增 Topic -> 编写生产者逻辑 -> 编写消费者逻辑
基本概念
- Topic:逻辑队列,不同 Topic 可以建立不同的 Topic
- Cluster:物理集群,每个集群中可以建立多个不同的 Topic
- Producer:生产者,负责将业务消息发送到 Topic 中
- Consumer:消费者,负责消费 Topic 中的消息
- ConsumerGroup:消费者组,不同组 Consumer 消费进度互不干涉
- partition:Topic 内部的分区
- Offset:消息在 partition 内的相对位置信息,可以理解为唯一 ID,在 partition 内部严格递增。
- ISR(In-Sync Replicas):与 Leader Replica 差距过大的 Follower Replica 会被踢出 ISR
- Replica:每个分片有多个 Replica,Leader Replica 将会从 ISR 中选出。
数据复制
Kafka 架构
ZooKeeper:负责存储集群元信息,包括分区分配信息等
Producer-数据压缩
通过压缩,减少消息大小,目前支持 Snappy、Gzip、LZ4、ZSTD 压缩算法
Broker-数据的存储
Consumer一消息的接收端
总结
- Producer:批量发送、数据压缩
- Broker:顺序写,消息索引,零拷贝
- Consumer:Rebalance
BMQ
BMQ文件结构
Broker - Partition 状态机
Broker - 写文件流程
Proxy
多机房部署
BMQ - 高级特性
泳道消息
- BOE:Bytedance Offline Environment,是一套完全独立的线下机房环境
- PPE:Product Preview Environment,即产品预览环境
Databus
直接使用原生SDK会有什么问题?
- 客户端配置较为复杂
- 不支持动态配置,更改配置需要停掉服务
- 对于latency不是很敏感的业务,batch效果不佳
- 简化消息队列客户端复杂度
- 解耦业务与Topic
- 缓解集群压力,提高吞吐