消息队列 | 青训营笔记

158 阅读3分钟

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

一、知识点介绍

本堂课主要讲消息队列的概念以及常用消息队列Kafka、BMQ、RocketMQ的模型及特性。

二、详细知识点介绍

1.什么是消息队列

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

image.png

2. Kafka

1)如何使用Kafka

创建集群->新增Topic->编写生产者逻辑->编写消费者逻辑 image.png

  • 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架构 image.png

2)Producer

  • 批量发送:批量发送可以减少IO次数,从而加强发送能力
  • 数据压缩:通过压缩钱少消息大小,目前支持Snapp、Gzip、LZ4、ZSTD(推荐)算法压缩
  • 数据存储:
    • Broker消息文件结构 image.png
    • 采用顺序写的方式进行写入,以提高写入效率
  • 数据读取
    • 偏移量索引文件:二分法找到小于目标offset的最大索引位置
    • 时间戳索引文件:二分法找到小于目标时间戳最大的索引位置,再通过寻找offset的方式找到最终数据
    • 传统数据拷贝 image.png
    • 零拷贝 image.png

3)Consumer-消息的接收端

image.png

  • 消息分配方式High Level image.png
  • Consumer Rebalance

3.BMQ

1)BMQ简介

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

  • 多了一个proxy承担Controller的责任 image.png

2)Broker

  • BMQ文件结构 image.png

  • Broker-Partition状态机

    • 保证对于任意分片在同一时刻只能在一个Broker上存活

image.png

  • 写文件流程 image.png

  • 读取 image.png

  • 多机房部署 image.png

  • 高级特性 image.png

  • 泳道消息

    • 开发流程:开发-BOE(Bytedance Offline Enbironment,一套完全独立的线下机房环境)-PPE(Product Preview Environment,产品预览环境)-Prod
    • 解决主干泳道流量隔离问题以及泳道资源重复创建问题 image.png
  • Databus image.png

  • Mirror:解决跨国读写问题 image.png

  • 使用Mirror通过最终一致的方式,解决跨Region读写问题 image.png

  • Index查询 直接在BMQ中将数据结构化,配置索引DDL,异步在想根据的字段构建索引后,通过Index Query服务读出数据 image.png

  • Parquet

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

    • 直接在BMQ中将数据结构化没通过Parquet Engine,可以使用不同的方式构建Parquet格式文件 image.png

4.RocketMQ

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

  • 基本概念 image.png 与Kafka区别在于partition编程了MessageQueue

  • 架构 image.png Nameserver为生产者和消费者提供了路由的概念,告诉其哪个queue在哪个broker里面

  • 存储模型 每个broker有且仅有一个CommitLog image.png

  • 高级特性

    • 最终一致性 image.png

    • 事务消息
      image.png

    • 延迟发送 image.png

    • 消费重试和死信队列 image.png