消息队列 | 青训营笔记

111 阅读3分钟

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

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

Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色

RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广

Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计

BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群

Kafka

使用场景

业务日志信息、用户行为数据、Metrics数据

使用Kafka

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

基本概念

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

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

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

image.png

image.png

Broker消息文件结构

image.png

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

Broker如何找到消息

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

image.png

Broker偏移量索引文件

二分找到小于目标 Offset 的最大文件

Consumer-消息端的接收

image.png

BMQ

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

image.png

运维操作对比

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

HDFS写文件流程

image.png

Broker-Partition 状态机

image.png

Broker 写文件流程

image.png

Broker-写文件Failover

image.png

BMQ高级特性

image.png

泳道消息

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

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

image.png

Databus

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

image.png

Mirror

image.png

Index

直接在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据

image.png

Parquet

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

RocketMQ

基础概念

名称KafkaRocketMQ
逻辑队列TopicTopic
消息体MessageMessage
标签Tag
分区PartitionConsumerQueue
生产者ProducerProducer
生产者集群Producer Group
消费者ConsumerConsumer
消费者集群Consumer GroupConsumer Group
集群控制器ControllerNameserver

架构

image.png

存储模型

密集索引

image.png