关于消息对列(下)| 青训营

82 阅读2分钟

消息队列之BMQ

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

BMQ文件结构

BMQ文件结构.png

相对于kafka来说,在BMQ集群中,因为对于单个副本来说是随机分配到不同的节点上的,因此不存在kafka中出现的负载不均衡的问题。

Partition 状态机机制

对于写入来说,为了保证一个分片不会同时出现在两个broker,当controller将分片放入后, 首先会start这个分片,然后进入Recover状态,这个状态主要有两个目的获取分片写入权利,也就是说, 只会允许我一个分片进行写入,只有拿到这个权利的分片我才能写入, 第二个目的是如果上次分片是异常中断的,没有进行save checkpoint,这里会重新进行一次save checkpoint,然后就进入了正常的写流程状态,创建文件,写入数据,到一 定大小之后又开始建立新的文件进行写入。 Broker之partition.png

broker写入过程

先将message拿去给CRC进行检验,检验参数是否是合法的,接着放Buffer通过一个异步的Writer Thread最后将数据存入。

泳道

当多个人同时进行测试时,需要等到上一个结束下个才能开始,效率过低,若是为每一个都准备一条通道又使得资源浪费,因此,使用下图的方式便能较好的解决这个问题

泳道信息.png

Databus的优点:

1.简化消息队列客户端复杂度 2.解耦业务于topic 3.缓解集群压力,提高吞吐

Mirror

当面对跨较长地区的读写问题,若是让其直接连接,会出现较长的延迟,对此,可以使用Mirror来解决问题,producter将各个BMQ上传后通过Mirror进行同步

Mirror解决跨地区的问题.png

Parquet

Parquet作为Hadoop生态圈的一种新型列式存储格式,可以兼容Hadoop生态圈中的大多数计算机框架,被多种查询引擎所支持。

parquet的存储方式.png

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

消息队列之RocketMQ

在Rocket中,数据流是通过Producter发送给Broker集群中,再由consumer进行处理;在Broker节点中有Master和Salve的概念;NAameServer为集群提供轻量级服务发现和路由。

Rocket存储模型.png

对于Brocker来说所有消息都会append到一个CommitLog上面,然后按照不同的queue,重新Dispatch到不同的consumer中,如此可以按照queue进行拉取。但是要注意ConsumerQueue中所存储的并不是真实的数据,真实的数据其实只存在CommitLog中。

RocketMQ的高级特性

事务消息、重试、死信队列、延迟队列