这是我参与「第五届青训营 」笔记创作活动的第 10 天 。
一、知识点介绍
本堂课主要讲消息队列的概念以及常用消息队列Kafka、BMQ、RocketMQ的模型及特性。
二、详细知识点介绍
1.什么是消息队列
消息队列(MQ),指保存消息的一个容器,本质是个队列。但这个队列需要支持高吞吐、高并发、并且高可用。
2. Kafka
1)如何使用Kafka
创建集群->新增Topic->编写生产者逻辑->编写消费者逻辑
- Topic:逻辑队列,不同Topic可以建立不同的Topic
- Partition:Topic的分区,不同分区的消息可以并发处理
- Offset:消息在partition内部的相对位置信息,可以理解为唯一ID,在partition内部严格递增
- Replica:每个分片有多个Replica,Leader Peplica将从ISR(In-Sync Replica)中选出,用于同步消息队列,服务容灾
- Cluster:物理集群,每个集群中可以建立多个不同的Topic
- Producer:生产者,负责将业务消息发送到Topic中
- Consumer:消费者,负责消费Topic中的消息
- ConsumerGroup:消费者组,不同组的Consumer消费进度互不干涉
- Kafka架构
2)Producer
- 批量发送:批量发送可以减少IO次数,从而加强发送能力
- 数据压缩:通过压缩钱少消息大小,目前支持Snapp、Gzip、LZ4、ZSTD(推荐)算法压缩
- 数据存储:
- Broker消息文件结构
- 采用顺序写的方式进行写入,以提高写入效率
- Broker消息文件结构
- 数据读取
- 偏移量索引文件:二分法找到小于目标offset的最大索引位置
- 时间戳索引文件:二分法找到小于目标时间戳最大的索引位置,再通过寻找offset的方式找到最终数据
- 传统数据拷贝
- 零拷贝
3)Consumer-消息的接收端
- 消息分配方式High Level
- Consumer Rebalance
3.BMQ
1)BMQ简介
兼容Kafka协议,存算分离,云原生消息队列
- 多了一个proxy承担Controller的责任
2)Broker
-
BMQ文件结构
-
Broker-Partition状态机
- 保证对于任意分片在同一时刻只能在一个Broker上存活
-
写文件流程
-
读取
-
多机房部署
-
高级特性
-
泳道消息
- 开发流程:开发-BOE(Bytedance Offline Enbironment,一套完全独立的线下机房环境)-PPE(Product Preview Environment,产品预览环境)-Prod
- 解决主干泳道流量隔离问题以及泳道资源重复创建问题
-
Databus
-
Mirror:解决跨国读写问题
-
使用Mirror通过最终一致的方式,解决跨Region读写问题
-
Index查询 直接在BMQ中将数据结构化,配置索引DDL,异步在想根据的字段构建索引后,通过Index Query服务读出数据
-
Parquet
-
Apache Parquet是Hadoop生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大多数计算框架(Hadoop、Spark等),被多种计算引擎支持(Hive、Impala、Drill等)
- 直接在BMQ中将数据结构化没通过Parquet Engine,可以使用不同的方式构建Parquet格式文件
- 直接在BMQ中将数据结构化没通过Parquet Engine,可以使用不同的方式构建Parquet格式文件
4.RocketMQ
一般针对电商业务线,其业务涉及广泛,如注册、订单、库存、物流等;同时也会设计许多业务的峰值时刻,如秒杀活动、周年庆、定期优惠等
-
基本概念
与Kafka区别在于partition编程了MessageQueue
-
架构
Nameserver为生产者和消费者提供了路由的概念,告诉其哪个queue在哪个broker里面
-
存储模型 每个broker有且仅有一个CommitLog
-
高级特性
-
最终一致性
-
事务消息
-
延迟发送
-
消费重试和死信队列
-