这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
消息队列原理与实战
四个场景,如何解决?
- 系统崩溃
- 服务处理能力有限
- 链路耗时长尾
- 日志如何处理
解决方案
案例一
解耦
案例二
削峰
案例三
异步
案例四
日志处理
什么是消息队列
消息队列(MQ),指保存消息的一个容器,本质是个队列。但是这个队列呢,需要支持高吞吐、高并发、并且高可用
消息队列发展历程
业界消息队列对比
消息队列-Kafka
使用场景
如何使用Kafka
基本概念
- Topic:逻辑队列,不同Topic可以建立不同的Topic
- Cluster:物理集群,每个集群中可以建立多个不同的Topic
- Producer:生产者,负责将业务消息发送到Topic中
- Consumer:消费者,负责消费Topic中的消息
- ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
基本概念-Offset
Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增
基本概念-Replica
每个分片有多个Replica,Leader Replica将会从ISR中选出
数据复制
Kafka架构
ZooKeeper:负责存储集群元信息,包括分区分配信息等
一条消息的自述
从一条消息的视角,为什么Kafka能支持这么高的吞吐量
思考
如果发送一条信息,等到其成功后再发一条会有什么问题
Producer-批量发送
如果消息量很大,网络带宽不够用,如何解决
Producer-数据压缩
Broker-数据的存储
如何存储到磁盘
Broker消息文件结构
Broker-磁盘架构
移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入。寻道成本比较高,因此顺序写可以减少寻道所带来的时间成本
Broker-顺序写
采用顺序写的方式进行写入,以提高写入效率
Broker-如何找到消息
Consumer通过发送FetchRequest请求消息数据,Broker会将指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer,寻找数据这个细节是如何做到?
Broker-偏移量索引文件
Broker-时间戳索引文件
Broker-传统数据拷贝
Broker-零拷贝
Consumer-消息的接收端
如何解决Partition在Consumer Group中的分配问题?
Consumer-Low Level
通过收动进行分配,哪一个Consumer消费者哪一个Partition完全由业务来决定
Consumer-High Level
Kafka-数据复制问题
Kafka-重启操作
Kafka-替换、扩容、缩容
Kafka-负载不均衡
Kafka-问题总结
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖Page Cache
- Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降
消息队列-BMQ
BMQ介绍
运维操作对比
HDFS写文件流程
BMQ文件结构
Broker-Partition状态机
Broker-写文件流程
Broker-写文件Failover
Proxy
多机房部署
BMQ高级特性
泳道消息
Databus
Mirror
Index
Parquet
Apache Parquet是Hadoop生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大多数计算框架(Hadoop、Spark等),被多种查询引擎支持(Hive、Impala、Drill等)
小结
- BMQ的框架模型(解决Kafka存在的问题)
- BMQ读写流程(Failover机制,写入状态机)
- BMQ高级特性(泳道、Databus、Mirror、Index、Parquet)
消息队列-RocketMQ
使用场景
例如,针对电商业务线,其业务涉及广泛,如注册、订单、库存、物流等;同时,也会设计许多业务峰值时刻,如秒杀活动、周年庆、定期特惠等
RocketMQ基本概念
RocketMQ架构
存储模型
高级特性-事务场景
高级特性-事务消息
高级特性-延迟发送
高级特性-延迟消息
高级特性-处理失败
高级特性-消费重试和死信队列
小结
- RocketMQ的基本概念(Queue, Tag)
- RocketMQ的底层原理(架构模型、存储模型)
- RocketMQ的高级特性(事务消息、重试和死信队列、延迟队列)