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

170 阅读4分钟

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

今日内容

学习完了青训营课程 后端入门 - 中间件 中的 消息队列前世今生 、 消息队列-Kafka消息队列-BMQ 和 消息队列-RocketMQ 之后的一些总结。

课程内容

  1. 前世今生
  2. 消息队列-Kafka
  3. 消息队列-BMQ
  4. 消息队列-RocketMQ

1. 前世今生

  • 消息队列应对的一些问题以及解决方案:
    1. 系统崩溃 - 解耦
    2. 服务处理能力有限 - 削峰
    3. 链路耗时长尾 - 异步
    4. 日志处理
  • 消息队列需要支持的特性
    • 高吞吐
    • 高并发
    • 高可用

2. 消息队列-Kafka

2.1 使用场景

搜索服务、直播服务、订单服务、支付服务、日志信息、Metrics 数据、用户行为

2.2 如何使用 Kafka

  • 创建集群
  • 新增 topic
  • 编写生产者逻辑
  • 编写消费者逻辑

2.3 基本概念

  • Topic:逻辑队列,不同 Topic 可以创立不同的 Topic
  • Cluster:物理集群,每个集群中可以创建多个不同的 Topic
  • Producer:生产者,负责将业务消息发送到 Topic 中
  • Consumer:消费者,负责消费 Topic 中的消息
  • ConsumerGroup:消费者组,不同组 Consumer 消费进度互不干涉
  • Replica:每个分片有多个 Replica,Leader Replica 将会从 ISR(In-Sync Replica) 中选出

2.4 数据复制

image.png

2.5 Kafka 架构

image.png

2.6 一条消息的自述

Producer->Broker->Consumer

2.7 Producer-数据压缩

Producer 一次发送多条消息,如果每次发送的消息过大可能导致带宽不够。此时可以通过压缩,减少消息大小,目前支持 Snappy、Gzip、LZ4、ZSTD 压缩算法。

2.8 Broker-数据的存储

消息文件结构

image.png

如何找到消息

Consumer 通过发送 FetchRequest 请求消息数据,Broker 会将指定 Offset 处的消息按照时间窗口和消息大小窗口发送给 Consumer。

2.9 Consumer-消息的接收端

image.png

2.10 Consumer Rebalance

帮助 Kafka 提高吞吐或者稳定性的功能

  • Producer:批量发送、数据压缩
  • Broker:顺序写,消息索引,零拷贝
  • Consumer:Rebalance

2.11 Kafka-数据复制问题

2.12 Kafka-重启操作

2.13 Kafka-替换、扩容、缩容

2.14 Kafka-负载不均衡

问题总结

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

3. 消息队列-BMQ

3.1 BMQ 简介

兼容 Kafka 协议、存算分离、云原生消息队列

image.png

3.2 运维操作对比

具体操作KafkaBMQ
重启需要数据复制,分钟级重启重启后可直接对外服务,秒级完成
替换需要数据复制,分钟级替换,甚至天级别替换后可直接对外服务,秒级完成
扩容需要数据复制,分钟级扩容,甚至天级别扩容后可直接对外服务,秒级完成
缩容需要数据复制,分钟级缩容,甚至天级别缩容后可直接对外服务,秒级完成

3.3 HDFS 写文件流程

3.4 BMQ 文件结果

image.png

3.5 Broker-Partition 状态机

image.png

写文件流程

image.png

3.6 Proxy

image.png

3.7 多机房部署

image.png

3.8 BMQ-高级特性

image.png

3.9 泳道消息

开发流程:开发->BOE->PPE->Prod

BOE:Bytedance Offine Environment,是一套完全独立的线下机房环境

PPE:Product Preview Environment,即产品预览环境

3.10 Databus

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

3.11 Mirror

3.12 Index

3.13 Parquet

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

小结

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

4. 消息队列-RocketMQ

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

4.1 RocketMQ 基本概念

image.png

4.2 RocketMQ 架构

image.png

4.3 存储模型

image.png

4.4 事务场景、事务消息、延迟发送、延迟发送、处理失败、消费重试和死信队列