消息队列原理与实战| 青训营笔记

129 阅读4分钟

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

消息队列原理与实战

四个场景,如何解决?

  • 系统崩溃

image.png

  • 服务处理能力有限

image.png

  • 链路耗时长尾

image.png

  • 日志如何处理

解决方案

案例一

解耦

image.png

案例二

削峰

image.png

案例三

异步

image.png

案例四

日志处理

image.png

什么是消息队列

消息队列(MQ),指保存消息的一个容器,本质是个队列。但是这个队列呢,需要支持高吞吐、高并发、并且高可用

image.png

消息队列发展历程

image.png

业界消息队列对比

image.png

消息队列-Kafka

使用场景

image.png

如何使用Kafka

image.png

基本概念

  • Topic:逻辑队列,不同Topic可以建立不同的Topic
  • Cluster:物理集群,每个集群中可以建立多个不同的Topic
  • Producer:生产者,负责将业务消息发送到Topic中
  • Consumer:消费者,负责消费Topic中的消息
  • ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉

image.png

基本概念-Offset

Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增

image.png

基本概念-Replica

每个分片有多个Replica,Leader Replica将会从ISR中选出

image.png

数据复制

image.png

Kafka架构

ZooKeeper:负责存储集群元信息,包括分区分配信息等

image.png

一条消息的自述

从一条消息的视角,为什么Kafka能支持这么高的吞吐量 image.png

思考

如果发送一条信息,等到其成功后再发一条会有什么问题

image.png

Producer-批量发送

如果消息量很大,网络带宽不够用,如何解决

image.png

Producer-数据压缩

image.png

Broker-数据的存储

如何存储到磁盘

image.png

Broker消息文件结构

image.png

Broker-磁盘架构

移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入。寻道成本比较高,因此顺序写可以减少寻道所带来的时间成本

image.png

Broker-顺序写

采用顺序写的方式进行写入,以提高写入效率

image.png

Broker-如何找到消息

Consumer通过发送FetchRequest请求消息数据,Broker会将指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer,寻找数据这个细节是如何做到?

image.png

Broker-偏移量索引文件

image.png

image.png

image.png

Broker-时间戳索引文件

image.png

Broker-传统数据拷贝

image.png

Broker-零拷贝

image.png

Consumer-消息的接收端

如何解决Partition在Consumer Group中的分配问题?

image.png

Consumer-Low Level

通过收动进行分配,哪一个Consumer消费者哪一个Partition完全由业务来决定

image.png

Consumer-High Level

image.png

Kafka-数据复制问题

image.png

Kafka-重启操作

image.png

Kafka-替换、扩容、缩容

image.png

Kafka-负载不均衡

image.png

image.png

Kafka-问题总结

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

消息队列-BMQ

BMQ介绍

image.png

运维操作对比

image.png

HDFS写文件流程

image.png

BMQ文件结构

image.png

Broker-Partition状态机

image.png

Broker-写文件流程

image.png

Broker-写文件Failover

image.png

Proxy

image.png

多机房部署

image.png

BMQ高级特性

image.png

泳道消息

image.png

image.png

image.png

image.png

Databus

image.png

image.png

image.png

Mirror

image.png

image.png

Index

image.png

image.png

Parquet

Apache Parquet是Hadoop生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大多数计算框架(Hadoop、Spark等),被多种查询引擎支持(Hive、Impala、Drill等)

image.png

image.png

小结

  • BMQ的框架模型(解决Kafka存在的问题)
  • BMQ读写流程(Failover机制,写入状态机)
  • BMQ高级特性(泳道、Databus、Mirror、Index、Parquet)

消息队列-RocketMQ

使用场景

例如,针对电商业务线,其业务涉及广泛,如注册、订单、库存、物流等;同时,也会设计许多业务峰值时刻,如秒杀活动、周年庆、定期特惠等

RocketMQ基本概念

image.png

image.png

RocketMQ架构

image.png

存储模型

image.png

高级特性-事务场景

image.png

高级特性-事务消息

image.png

高级特性-延迟发送

image.png

image.png

高级特性-延迟消息

image.png

高级特性-处理失败

image.png

高级特性-消费重试和死信队列

image.png

小结

  • RocketMQ的基本概念(Queue, Tag)
  • RocketMQ的底层原理(架构模型、存储模型)
  • RocketMQ的高级特性(事务消息、重试和死信队列、延迟队列)