这是我参与「第五届青训营 」笔记创作活动的第9天
消息队列已经是一个很常见的中间件了,但我没想到它在那么早就已经被发明并广泛运用了。至于为什么平时学习的时候好像没有听说过,我个人猜测还是因为主要是生产环境用的多,日常学习做的项目基本上就没什么机会用到。
消息队列应用场景
消息队列是保存消息的一个容器,本质是个队列。但需要支持高吞吐,高并发,高可用。
- 解耦:将程序的操作与执行解耦,这样执行的结果就不会影响整个系统的运行。
- 削峰:可以将庞大的请求存起来逐个处理,避免服务被庞大的请求打垮。
- 异步:系统能够异步地处理队列中的消息。
- 日志处理:能够对系统执行的消息进行一个日志的管理。
Kafka
Kafka 是业内非常知名的消息队列,在高吞吐场景下发挥较为出色。
基本概念
-
Topic:逻辑队列
-
Cluster:物理集群,每个集群中可以建立多个不同的Topic
-
Producer:生产者,负责将业务消息发送到Topic中
-
Consumer:消费者,负责消费Topic中的消息
-
ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
-
Replica:每个分片有多个Replica,Leader Replica将会从ISR中选出
可以发现现在绝大多数框架的组件构成非常相似。我认为这些组件的构成与分布式架构息息相关,毕竟它们作为分布式应用,按照分布式的模型去构建是非常合理的。 这也让我不得不把MIT6.824的实现提上日程。
高吞吐的实现
- Producer-数据压缩(推荐ZSTD压缩算法)
- Broker-顺序写
- Broker-偏移量索引
- Broker-零拷贝
- Consumer-Low Level
- Consumer-High Level
- Consumer-Rebalance
缺点
- 数据复制问题
- 重启操作
- 替换、扩容、缩容
- 负载不均衡
BMQ
BMQ是字节自研消息队列,是对Kafka的改进。
文件结构
随机选择一定数量的DataNode进行写入,打散Partition,从而做到负载均衡。
Partition状态机
保证对于任意分片在同一时刻只能在一个Broker上存活。
Proxy
实现了一个Cache来代替page cache
高级特性
泳道、Databus、Mirror、Index、Parquet