[ 消息队列- BMQ | 青训营笔记 ]

242 阅读3分钟

一. BMQ简介

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

二. HDFS写文件流程

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

三. BMQ文件结构

在BMQ集群中,因为对于单个副本来讲,是随机分配到不同的节点上面的,因此不会存在Kafka的负载不均问题

四. Broker-Partition状态机

Controller做好分片的分配之后,如果在该Broker分配到了Broker, 首先会start这个分片,然后进入Recover状态,这个状态主要有两个目的获取分片写入权利,也就是说,对于hdfs来讲,只会允许我一个分片进行写入,只有拿到这个权利的分片我才能写入,保证对于任意分片在同一时刻只能在一个Broker上存活,第二个目的是如果上次分片是异常中断的,没有进行save checkpoint,这里会重新进行save checkpoint,然后就进入了正常的写流程状态,创建文件,到一定大小之后又开始建立新的文件进行写入

五. Broker-写文件流程

数据校验->参数是否合法->会把数据放入Buffer中->Writer Thread

六. Broker-写文件Failover

如果我们挑选节点中有一个出现了问题,导致不能正常写入了,可以重新找正常的节点创建新的文件进行写入,这样也就保证了写入的可用性

七. 读取文件Proxy

Fetch Request->Wait流程,有一个Topic, 如果一直没有数据写入,consumer就会一直发送Fetch Request,如果Consumer数量过多,server端是扛不住的,故设置一个等待机制->Cache去找是否有存在我们想要的数据,如果有直接返回,如果没有,再开始去存储系统当中寻找,首先会Open这个文件, 然后通过Index找到数据所在的具体位置,从这个位置开始读取数据,即

  1. Open File
  2. Seek
  3. Read

八. 多机房部署

防止机房级故障所带来的影响

九. BMQ-高级特性

9.1 泳道消息

开发流程

开发->BOE->PPE->Prod

BOE: Bytedance Offline Environment,是一套完全独立的线下机房环境,多个人同时测试,需要等待上一个人测试完成

PPE: Product Preview Environment,即产品预览环境,对于PPE的消费者来说,资源没有生产环境多,所以无法承受生产环境的流量

9.2 Databus

9.2.1解决问题:
  1. 客户端配置较为复杂
  2. 不支持动态配置,更改配置需要停掉服务
  3. 对于latency不是很敏感的业务,batch 效果不佳
9.2.2优点:
  1. 简化消息队列客户端复杂度
  2. 解耦业务与Topic
  3. 缓解集群压力,提高吞吐

9.3. Mirror

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

9.4 Index

通过写入的Logld、 Userld或者其他的业务字段进行消息的查询,可以直接在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据

9.5 Parquet

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

十. 个人感悟

  1. 一个事物的提出通常是要解决某一特定实际问题的,多去思考
  2. 多敲代码