消息队列 | 青训营

117 阅读3分钟

今天这篇文章要介绍的是消息队列(MQ),消息队列指保存消息的一个容器,本质上是一个队列,但这个队列需要支持高吞吐、高并发、高可用。在日常生活中,我们网购下单时,消息队列正在后台默默发挥着作用...

一、初看消息队列

1.1 消息队列发展历程

屏幕截图 2023-08-27 185151.png

1.2 业界消息队列对比

Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色
RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广
Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计
BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群

二、消息队列-Kafka

2.1 使用场景

屏幕截图 2023-08-27 202250.png

2.2 使用Kafka四步曲

①首先创建一个Kafka集群
②在集群中创建一个Topic,并且设置好分区数量
③编写生产者逻辑,引入Kafka的SDK,分别去实现上游的生产逻辑
④编写消费者逻辑,调用Poll方法

2.3 基本概念

屏幕截图 2023-08-27 203302.png -Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增。 -Replica(每个分片有多个Replica,Leader Replica将会从ISR中选出)

2.4 Kafka架构

屏幕截图 2023-08-27 204240.png

2.5 Producer

-批量发送:批量发送可以减少IO次数,从而加强发送能力。
-数据压缩:减少消息大小,目前支持Snappy、Gzip、LZ4、ZSTD压缩算法。

2.6 Broker偏移量索引文件

二分找到小于目标offset的最大文件,找到小于目标offset的最大索引位置

2.7 Consumer

消息的接收端,Rebalance。

2.8 Kafka存在的问题

①运维成本高
②对于负载不均衡的场景,解决方案复杂
③没有自己的缓存,完全依赖Page Cache
④Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降

三、消息队列-BMQ(兼容Kafka协议,存算分离,云原生消息队列)

3.1 BMQ架构

屏幕截图 2023-08-27 210009.png

3.2 HDFS写文件流程-随机选择一定数量的DataNode进行写入

3.3 BMQ文件结构

屏幕截图 2023-08-27 210214.png

3.4 Broker-写文件流程

屏幕截图 2023-08-27 210333.png

3.5 Proxy读取数据流程

屏幕截图 2023-08-27 211001.png 注:Wait流程由两个配置决定:①设置数据大小窗口;②设置时间窗口。

3.6 多机房部署

屏幕截图 2023-08-27 211318.png

3.7 BMQ-高级特性

屏幕截图 2023-08-27 211543.png

3.7.1 泳道消息

屏幕截图 2023-08-27 213403.png

3.7.2 Databus

①简化消息队列客户端复杂度
②解耦业务与Topic
③缓解集群压力,提高吞吐

3.7.3 Mirror

使用Mirror通过最终一致的方式,解决跨Region读写问题。

3.7.4 Index

屏幕截图 2023-08-27 212603.png 直接在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据。

3.7.5 Parquet

Apache Parquet是Hadoop生态圈中一种新型列式存储格式,可以兼容Hadoop生态圈中大多数计算框架,被多种查询引擎支持。 屏幕截图 2023-08-27 212429.png 直接在BMQ中将数据结构化,通过Parquet Engine,可以使用不同的方式构建Parquet格式文件。

四、消息队列-RocketMQ

4.1 基本概念

屏幕截图 2023-08-27 222551.png

4.2 RocketMQ架构

屏幕截图 2023-08-27 225026.png

4.3 高级特性

①事务消息
②延迟发送
③消费重试和死信队列

消息队列在网购后台发挥了重要的作用,像商家的库存显示等都依赖着消息队列的实现。通过阅读这篇文章,相信大家对消息队列有了初步的认知,能够与实际生活相联系,理解一些消息队列在日常生活当中的运用。