消息队列原理与实践 | 青训营

108 阅读4分钟

这是我参与[第五届青训营]伴学笔记的第13天。

1.1问题引出

  1. 系统崩溃
  2. 服务能力有限
  3. 链路耗时长尾
  4. 日志如何处理

2.1使用场景

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

2.2如何使用Kafka

新增集群->新增Topic->编写生产者逻辑->编写消费者逻辑

2.3基本概念

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

2.4数据复制

image.png

2.5Kafka架构

image.png

2.6一条消息的自述

producer生产到broker,然后消费consume。

2.7producer

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

2.8数据的存储

Broker消息文件结构

image.png

路径:/Topic/Partition/Segment/(log|index|timeindex l ...)

Broker磁盘结构

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

Broker顺序写

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

Broker如何找到消息

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

Broker偏移量索引文件

二分找到小于目标offset的最大索引位置

Broker时间戳索引文件

二分找到小于目标时间戳最大的索引位置,在通过寻找 offset的方式找到最终数据。

Broker传统数据拷贝

image.png

Broker零拷贝

image.png

2.9consumer消息的接收端

low level

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

image.png

缺点:

  1. 当consumer故障,partition数据流会断开,无法容灾。
  2. 可能发生机器或进程的启停,会导致数据中断。

high level

image.png

协调者来帮助各个conwumer进行自动分配partition,该过程也叫做rebalance。

可以帮助Kafka提高吞吐或者稳定性的功能的方法:

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

2.10Kafaka数据复制问题

  • 重启操作

关闭leader,选定follower为新leader重启后,原leader追赶新leader写数据,该过程可能导致数据差异。数据同步完成后。需要leader回切,时间成本高。

  • 替换、扩容、缩容

节点的变动都会带来时间成本、运维成本以及人工成本。

  • 负载不均衡

问题总结

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

03.消息队列-BMQ

BMQ简介

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

image.png

3.2运维操作对比

image.png

3.3HDFS写文件流程

随机选择一定数量的Database进行写入

image.png

3.4BMQ文件结构

全部segment都不全部分布在同个节点,随机在集群中分配。

image.png

3.5broker

partation状态机

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

image.png

写文件流程

image.png

消息先进行CRC校验。检查参数是否合法,检验完后,将数据存入buffer,通过异步writer thread将数据拉出来做最终写入,写入完成后,写入底层的roil new segment file。还能配置返回策略。

写文件 failover

如果 DataNode节点挂了或者是其他原因导致我们写文件失败,应该如何处理? 不能等待节点,而是寻找可用节点将其替换。

3.6 proxy

image.png

3.7多机房部署

image.png

3.8 BMQ-高级特性

image.png

3.9泳道消息

BOE: Bytedance Offline Environment,是一套完全独立的线下机房环境 PPE: Product Preview Environment,即产品预览环境

小结

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