消息队列 | 青训营笔记

51 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第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