这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
这里主要是,消息队列应用场景、发展历史以及常见消息队列类型的介绍,帮助大家更好地了解消息队列。已经实际使用方面相关的一些内容,走入到消息队列的世界中。
-
一些令人崩溃的场景:
- 系统崩溃
- 服务处理能力有限
- 链路耗时长尾
- 日志如何处理
-
消息队列:保存消息的一个容器,本质就是个队列,需要支持:
- 高吞吐
- 高并发
- 高可用
前世今生
- 业内猛的MQ:
RocketMQ阿里自研
PULSAR腾讯用的
BMQ字节用的,类似PULSAR
Kafka
- 使用场景:
-
如何使用Kafka
- 创建Kafka集群
- 新建Topic & 分区数量
- 引入SDK,编写生产者逻辑
- 编写消费者逻辑。
基本概念
- Topic: 逻辑队列,不同Topic可以建立不同的Topic
- Cluster: 物理集群,每个集群中可以建立多个不同的Topic
- Producer: 生产者,负责将业务消息发送到Topic中
- Consumer: 消费者,负责消费Topic中的消息
- ConsumerGroup: 消费者组,不同组Consumer消费进度互不干涉
- Partition: Topic的一个分区的概念,一个Topic有多个分区,不同分区的消息是可以并发处理的。可以提升单个Topic中,并发处理的能力。
- Offset: 消息在Partition内的相对位置信息,可以理解为唯一ID,在Partition内,严格递增。
- Replica:每个分片有多个Replica,Leader Replica将会从ISR中选出。(容灾的时候用的昂!!!看到了熟悉的Leader/Follower结构。Leader宕机了,重新选一个Follower -> New Leader)
数据复制
第二个broker本身还担任Controller的角色,帮助我们计算副本的分配逻辑。(Controller的作用)
Kafka架构
数据压缩&Batch Send
Broker数据的存储
Broker消息文件结构
顺序写,可以减少寻道所带来的时间成本
顺序写
Broker数据的查找
Broker偏移量索引文件
这里是稀疏索引,所以找到小于目标offset的最大文件,就能找到索引啦!!!
时间戳索引文件
offset上层加了一层时间戳索引
通过时间戳进行文件索引
Broker数据的拷贝
传统数据拷贝
很多数据拷贝
零拷贝
Consumer消息的接收
consumer拉去哪个partition呢?
-
缺点:
- 如果Consumer挂掉了,数据流就挂掉了,不能自动容灾。
- 手动新增Consumer,也很难分配workload
High Level
其中一个Broker充当Coordinator的角色,负责协调。
Coordinator,动态感知,并进行Partition的管理和动态分配。
Consumer Rebalance
- 第一轮请求:一开始Consumer不知道哪个是Coordinator。随机找一个broker,连接上,看看哪个是Coordinator
- 第二轮请求:Consumer告诉Coordinator,自己要加入ConsumerGroup当中
- Coordinator从Group中,选出一个Leader
提供一些业务特性,选一个Leader
- 第三轮请求:发送集群同步请求,并且携带分配方案
- 例如,心跳维持集群的链接,如果Coordinator和例如Consumer3的心跳断了,就自动Rebalance,去掉Consumer3,重新进行分配。
帮助Kafka提高吞吐&稳定性总结
-
刚刚总共讲了哪一些可以帮助Kafka提高吞吐或者稳定性的功能?
- Producer: 批量发送、数据压缩
- Broker: 顺序写,消息索引,零拷贝
- Consumer: Rebalance
Kafka数据复制问题
重启操作
替换、扩容、缩容
只要有集群节点的变动,就会产生数据复制的时间成本昂!(分片在变动嘛orz,唉,导致副本的迁移啊之类的,很多事情orz)
- 负责不均衡也会在这个过程中产生
Kafka问题总结
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖Page Cache
- Controller 和Coordinator和Broker在同一进程中,大量I0会造成其性能下降
BMQ
兼容Kafka协议,存算分离,云原生消息队列
介绍
运维对比
Broker和Proxy都是无状态,不和数据绑定,数据都在底层的HDFS中,运维非常快!!!
Partition状态机
Broker写文件流程
Proxy
多机房部署
高级特性
泳道消息
BOE: Bytedance Offline Environment,PPE: Product Preview Enrionment
RD -> BOE -> PPE -> Prod
- 泳道消息:
泳道相当于创建了一个环境嘛,流量都能在我的环境里昂!!!
Databus
Mirror
跨区域,时延非常长!!!
异步跨区域进行操作,提升效率。强一致性 -> 最终一致性
Index
业务不是非常友好昂,可能想要自己的索引!!!
Parquet
Apache Parquet是Hadoop生态圈中-种新型列式存储格式,它可以兼容Hadoop生态圈中大 多数计算框架(Hadoop、Spark等), 被多种查询引擎支持(Hive、Impala、 Drill等)。
- 列存储:
RocketMQ
主要用于低延时的场景:例如,针对电商业务线,其业务涉及广泛,如注册、订单、库存、物流等;同时,也会涉及许多业务峰值时刻,如秒杀活动、周年庆、定期特惠等
基本概念
Tag能够支持更多的应用场景昂!
架构
存储模型
高级特性
事务场景
- 事务消息:
简单的两阶段提交嘛!
延迟消息
定时任务,cronjob,不错昂!
- 流程:
消息重试&死信队列
比如重试了多次没法处理,放入死信队列,人工就可以看看死信队列里的消息昂!!!