消息队列 | 青训营笔记

106 阅读4分钟

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

消息队列

基本概念

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

业界消息队列对比

  • Kafka:分布式的,分区的,多副本的日志提交服务,在高吞吐场景下发挥较为出色
  • RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可拓展性,在一些实时场景中运用较广
  • Pulsar:下一代云原生分布式消息流平台,集消息、存储、轻量化函数实计算为一体、采用存算分离的架构设计
  • BMQ:和 Pulsar 架构类似,存算分离,初期定位时承接高吞吐的离线业务场景,逐步替换掉对应的 Kafka 集群

Kafka

适用场景

  • 搜索服务
  • 直播服务
  • 订单服务
  • 支付服务

如何适用 Kafka

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

基本概念

  • Topic:逻辑队列,不同 Topic 可以创建不同的 Topic
  • Cluster:物理集群,每个集群中可以创建多个不同的 Topic
  • Producer:生产者,负责将业务消息发送到 Topic 中
  • Consumer:消费者,负责消费 Topic 中的消息
  • ConsumerGroup:消费者组,不同组 Consumer 消费进度互不干涉
  • Offset:消息在 partion 内的相对位置信息,可以理解为唯一 ID,在 partition 内部严格递增
  • Replica:每个分片有多个 Replica,Leader Replica 将会从 ISR 中选出

Producer

批量发送
  • 可以减少 IO 次数,从而加强发送能力
数据压缩
  • 通过压缩,减少消息大小,目前支持 Snappy、Gzip、LZ4、ZSTD 压缩算法

Broker

磁盘结构
  • 移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入,训导成本比较高,因此顺序写可以减少训导所带来的时间成本
顺序写
  • 采用顺序写的方式进行写入,以提高写入效率
如何找到消息
  • Consumer 通过发送 FetchRequest 请求消息数据,Broker 会将指定 Offset 处的消息,按照时间窗口和消息大小窗口发送给 Consumer
偏移量索引文件
  • 二分找到小于目标 offset 的最大文件
时间戳索引文件
  • 二分找到小于目标时间戳最大的索引位置,在通过寻找 offset 的方式找到最终数据

Consumer

Low Level
  • 通过手动进行分配,哪一个 Consumer 消息哪一个 Partition 完全由业务来决定
High Level
Rebalance

重启操作

  • 关闭、重启
  • Leader 切换,追赶数据
  • 数据同步完成
  • Leader 回切

BMQ

简介

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

运维操作对比

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

Broker - Partition 状态机

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

泳道消息

开发流程
  • 开发
  • BOE
  • PPE
  • Prod
BOE
  • 一套完全独立的线下机房环境
  • 多个人同时测试,需要等待上一个人测试完成
  • 每多一个测试人员,都需要重新搭建一个相同配置的 Topic,造成人力和资源的浪费
PPE
  • 产品预览环境
  • 对于 PPE 的消费者来说,资源没有生产环境多,所以无法承受生产环境的流量

Databus

直接适用原生 SDK 的问题
  • 客户端配置较为复杂
  • 不支持动态配置,更改配置需要停止服务
  • 对于 latency 不是很敏感的业务,batch 效果不佳
解决
  • 简化消息队列客户端复杂度
  • 解耦业务与 Topic
  • 缓解集群压力,提高吞吐

Mirror

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

Index

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

Parquet

  • Apache Parquet 是 Hadoop 生态圈中一种新型列式存储格式,它可以兼容 Hadoop 生态圈中大多数计算框架(Hadoop、Spark 等),被多种查询引擎支持(Hive、Impala、Drill等)
  • 直接在 BMQ 中将数据结构化,通过 Parquet Engine,可以使用不同的方式构建 Parquet 格式文件

RocketMQ

基本概念

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

高级特性

  • 事务场景

    • 最终一致性
  • 事务消息

  • 延迟发送

  • 延迟消息

  • 处理失败

  • 消息重试和死信队列