这是我参与「第五届青训营 」笔记创作活动的第15天
只不过是字节给我的任务罢了
BMQ
兼容Kafka协议,存算分离,云原生消息队列
Controller与Coordinator分离,增加Proxy
运维操作上BMQ在重启、替换、扩缩容上的性能均优于Kafka
HDFS写文件流程
随机选择一定数量的DataNode进行写入
Client-->DataNode-->Client
BMQ文件结构
Broker-Partition状态机
保证对于任意分片在同一时刻只能在一个Broker上存活
争夺写入权利
Broker-写文件流程
Broker-写文件Failover
如果DataNode节点挂了,那么则重新找一个新的DataNode继续写入
Proxy
设置了一个等待机制,如果Proxy没有数据,则会等待一段时间再返回给用户层,减轻IO压力,如果Cache命中,则直接返回数据,否则进入Storage中查找
多机房部署
BMQ高级特性
泳道消息
开发流程:开发-->BOE-->PPE-->Prod
-
BOE:ByteDance Office Environment,一套完全独立的线下机房环境
- 多人同时测试,每个人测试都要等待上一个人测试完,串行测试
-
PPE:Product Preview Environment,产品预览环境
- 对于PPE消费者来说,资源没有生产环境多,所以无法承受生产环境的流量
解决主干泳道流量隔离和泳道资源重复创建的问题,泳道n的Consumer只能消费泳道n的Producer生产的资源
DataBus
使用DataBus,客户端配置简单,支持动态配置
Mirror
使用Mirror异步拉取,写入,通过最终一致的方式,解决跨Region读写问题
Index
直接在BMQ中将数据结构化,配置一个索引DDL,异步构建索引后,通过Index Query服务读出数据
Parquet
Apache Parquet是Hadoop生态圈的一种新型列式存储格式,可以兼容Hadoop生态圈大多数计算框架(Hadoop、Spark),被多种查询引擎支持(Hive、Impala、Drill)
直接在BMQ中将数据结构化,通过Parquet Engine,使用不同方式构建Parquet格式文件
Rocket MQ
适用于低延时、实时性要求高,业务峰值时刻的场景
RocketMQ比Kafka多出标签Tag、生产者集群ProducerGroup(用于支持事务消息)两个概念,并且分区是ConsumerQueue,集群控制器是Nameserver
架构
Nameserver提供路由信息
存储模型
高级特性
事务场景
使用事务保证最终一致性,Producer先把消息发给服务端,服务端返回成功的请求,在本地执行完本地事务,再把事务提交给Server,Sever会查询事务执行状态,已提交的发送给Consumer,回滚的丢弃
延迟发送
ScheduleMessage提供消息回写功能,回写的消息是正常消息一样的格式,可以做到延迟发送到效果
消费重试和死信队列
超过重试次数后会进入死信队列,这个队列只能由人工处理,下图超过重试次数后应为进入死信队列,而非ScheduleTopic