消息队列 | 青训营笔记

79 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

1 Why Message Queue?

1.1 服务崩溃:

​ 整个服务链路中一环出现问题,导致服务全部消息丢失

image-20230213103721776.png

1.2 服务能力有限:

​ 一个秒杀活动,短时间内挤入大量请求,服务器响应不过来

image-20230213103701252.png

1.3 链路长尾问题

image-20230213105219230.png

1.4 日志存储

​ 避免重要日志丢失

1.5 历程

image-20230213105929287.png

  • Kafka:

    分布式、分区、多副本的日提交,在高吞吐场景下发挥出色

  • RocketMQ:

    低延迟、强一致、高性能、高可靠、万亿级容量和灵活性可扩展性

  • Pulsar:

    是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构

  • BMQ:

    和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的 Kafka集群

2. 主要消息队列介绍

3.1 Kafka

3.1.1 如何使用

​ 发布 - 订阅模式 : 创建集群 --> 新增 Topic --> 编写生产者逻辑 --> 编写消费者逻辑

image-20230213110946586.png

  • 每个分片(Partition) 都有多个副本 Replica, Leader Replica 从 ISR (In Sync Replica)中选出。

3.1.2 kafka 架构

架构图:

image-20230213111737506.png

数据分区复制:

image-20230213115526505.png

3.1.3 消息发送:

​ 批量发送,减少 I/O耗时、 压缩消息,减小消息大小。

Broker消息文件结构:

image-20230213112640330.png

数据路径:/Topic/Partition/Segment/(log/index/timeindex)

3.1.4 消息接受:

引入 Coordinator 进行自动分配分区, 新增或删减 consumer, 会进行 Rebalance

image-20230213120923009.png

3.1.5 kafka 重启

image-20230213121722024.png

  • Leader 回切目的:假设有 100 个集群, 前 99 个节点需要不停的重启,如果Leader不回切,那么所有 Topic 的Leader都会堆积到了 第 100 集群节点上,导致该集群节点读写压力非常大。

3.2 BMQ

​ 兼容 kafka 协议,存算分离,云原生消息队列

3.2.1 架构

image-20230213123013468.png

Proxy 是无状态的,消息不做任何处理,直接传给 Broker

3.2.2 文件结构 (HDFS)

​ 可对比下与 kafka 的区别, BMQ 中每一个 segment 都随机分配到不同数量的 DataNode, 而不像 kafka,同一个 Partition 的全部分配到一个节点。

image-20230213123553484.png