消息队列-BMQ
BMQ简介
兼容kafka协议,存算分离,支持云原生消息队列
BMQ介绍
BMQ与kafka类似,底层使用分布式存储系统HDFS,Meta Storage System类似于Zookeeper。BMQ架构图如下
运维操作对比
| 具体操作 | Kafka | BMQ |
|---|---|---|
| 重启 | 需要数据复制,分钟级重启 | 重启后可直接对外服务,秒级完成 |
| 替换 | 需要数据复制,分钟级替换,甚至天级别 | 替换后可直接对外服务,秒级完成 |
| 扩容 | 需要数据复制,分钟级扩容,甚至天级别 | 扩容后可直接对外服务,秒级完成 |
| 缩容 | 需要数据复制,分钟级缩容,甚至天级别 | 缩容后可直接对外服务,秒级完成 |
BMQ写入流程
HDFS写文件流程
首先随机选取DataNode中的几个datanode进行写入。对于kafka负载不均衡的问题,每次随机的选择不会导致同一个partition中的所有segment分配到同一个节点,导致负载。
Broker-Partition状态机
在Broker的写入过程中有一个状态机的机制。目的在于一是防止脑裂问题 (Split Brain Problem),二是对于保证对于任意分片在同一时刻只能在一个Broker上存活,防止乱序情况。
脑裂问题:分布式系统的脑裂问题(Split-Brain Problem)是指一个分布式系统在发生网络故障或节点故障时,
可能会导致系统中的不同节点之间出现失去联系、无法相互通信的情况,而这些节点可能会独立地进行操作,
导致系统出现数据不一致或冲突的问题。
首先Contorller计算分配方案,通过通信协议告诉某个partition需要在某个Broker启动,然后先建立start,进入recover流程,在recover中一是争夺写入权力,二是如果出现异常,recover用于恢复数据;系统正常运行后进入save checkpoint,进入创建segment,追加数据到文件,到一定量数据结束该segment,重新创建新的segment。如果append过程中出现中断,failover机制处理。
Failover: 如果写入过程中,某个datanode挂了或其他原因导致写文件失败,failover机制会寻找一个可用节点,创建新的segment,防止写入中断。
BMQ读入流程
Wait: 防止频繁请求,降低IO压力
cache:如果命中(hit),直接返回数据,没有命中(miss)从stroage中寻找。
多机房部署
不仅需要防止单机故障,也需要防止机房级别的故障(机房断电等)。
上图中每个机房会处理全量的Partition,Distributed File System也是三机房,无论哪个机房发生故障,其他机房承接所有流量。
BMQ高级特性
泳道:每个Topic会附带一个Topic,分别称为主干Topic和泳道Topic,解决主干泳道流量隔离问题以及泳道资源重复创建问题。
databus:解决直接使用原生SDK会出现客户端配置复杂,更改配置需要停止服务,对latency不敏感的业务,batch效果不佳等问题。databus简化了消息队列客户端复杂度,解耦了业务和Topic,能够缓解集群压力,提高吞吐。
Mirror:主要解决跨区域(Region)读写问题,即不同国家地区高延迟等问题。Mirror通过最终统一方式解决跨Region问题,不同地区的BMQ都经过Mirror,再通过异步方式发送到不同的BMQ,在用户视角下,降低延迟。
Index:实现业务数据的反查。一是通过Offet查询,二是通过时间(timestamp)查询,但是太麻烦,解决办法是直接在BMQ中将数据结构化,而配置类似Mysql中的DDL,移步构建索引,再通过Index Query服务读出数据。
Parquet:Apache Parquet;是Hadoop:生态圈中一种新型列式存储格式,它可以兼容Hadoop生态圈中大 多数计算框架(Hadoop、Spark等),被多种查询引擎支持(Hive、Impala、Drill等)。
消息队列-RocketMQ
使用场景
RocketMQ主要用于低延时场景,如:订单,秒杀场景等等。
基本概念
Kafka与RocketMQ对比
| 名称 | Kafka | RocketMQ |
|---|---|---|
| 逻辑队列 | Topic | Topic |
| 消息体 | Message | Message |
| 标签 | 无 | Tag |
| 分区 | Partition | ConsumerQueue |
| 生产者 | Producer | Producer |
| 生产者集群 | 无 | Producer Group |
| 消费者 | Consumer | Consumer |
| 消费者集群 | Consumer Group | Consumer Group |
| 集群控制器 | Controller | Nameserver |
kafka和RocketMQ中Topic下的子维度从partition变为了ConsumerQueue。
RocketMQ架构
NameServer引入了路由概念,告诉生产者或者消费者某个队列的在哪个broker上。
RocketMQ存储模型
移步一文详解RocketMQ的存储模型 - 掘金 (juejin.cn)
RocketMQ高级特性
事务消息:RocketMQ提供事务消息功能,支持分布式消息的处理。在发送事务消息时,可以将事务消息的状态和操作存储在本地数据库中,以便在后续的消息确认操作中使用。
延迟消息:可以设置消息的延迟时间,使得消息在指定时间后才被消费者使用。
消息重试和死信队列: 可以设置消息最大重试次数,消息发送失败,将自动重试。当达到最大重试次数时,消息将进入死信队列,便于人工排查等等。