BMQ和RocketMQ | 青训营笔记

114 阅读3分钟

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

只不过是字节给我的任务罢了

BMQ

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

Controller与Coordinator分离,增加Proxy

image.png

运维操作上BMQ在重启、替换、扩缩容上的性能均优于Kafka

HDFS写文件流程

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

Client-->DataNode-->Client

BMQ文件结构

image.png

Broker-Partition状态机

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

争夺写入权利

Broker-写文件流程

image.png

Broker-写文件Failover

如果DataNode节点挂了,那么则重新找一个新的DataNode继续写入

Proxy

设置了一个等待机制,如果Proxy没有数据,则会等待一段时间再返回给用户层,减轻IO压力,如果Cache命中,则直接返回数据,否则进入Storage中查找

image.png

多机房部署

image.png

BMQ高级特性

image.png

泳道消息

开发流程:开发-->BOE-->PPE-->Prod

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

    • 多人同时测试,每个人测试都要等待上一个人测试完,串行测试
  • PPE:Product Preview Environment,产品预览环境

    • 对于PPE消费者来说,资源没有生产环境多,所以无法承受生产环境的流量

image.png

解决主干泳道流量隔离和泳道资源重复创建的问题,泳道n的Consumer只能消费泳道n的Producer生产的资源

DataBus

使用DataBus,客户端配置简单,支持动态配置

image.png

Mirror

使用Mirror异步拉取,写入,通过最终一致的方式,解决跨Region读写问题

image.png

Index

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

image.png

Parquet

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

image.png

直接在BMQ中将数据结构化,通过Parquet Engine,使用不同方式构建Parquet格式文件

image.png

Rocket MQ

适用于低延时、实时性要求高,业务峰值时刻的场景

RocketMQ比Kafka多出标签Tag、生产者集群ProducerGroup(用于支持事务消息)两个概念,并且分区是ConsumerQueue,集群控制器是Nameserver

image.png

架构

Nameserver提供路由信息

image.png

存储模型

image.png

高级特性

事务场景

使用事务保证最终一致性,Producer先把消息发给服务端,服务端返回成功的请求,在本地执行完本地事务,再把事务提交给Server,Sever会查询事务执行状态,已提交的发送给Consumer,回滚的丢弃

image.png

延迟发送

ScheduleMessage提供消息回写功能,回写的消息是正常消息一样的格式,可以做到延迟发送到效果

image.png

消费重试和死信队列

超过重试次数后会进入死信队列,这个队列只能由人工处理,下图超过重试次数后应为进入死信队列,而非ScheduleTopic

image.png

参考

juejin.cn/post/719632…