美文网首页面试精选
RocketMQ 6.核心原理解析

RocketMQ 6.核心原理解析

作者: 香沙小熊 | 来源:发表于2021-01-08 11:49 被阅读0次

1. 消息的存储结构

image.png
image.png

RocketMQ消息存储

2.同步刷盘与异步刷盘

RocketMQ消息存储:内存+磁盘存储,两种刷盘方式
异步刷盘


同步刷盘和异步刷盘.png
image.png
同步刷盘示意图 i异步刷盘未开启堆外缓存示意图
异步刷盘开启堆外缓存示意图

RocketMQ存储--同步刷盘和异步刷盘

3.同步复制与异步复制

  • 同一组Broker有Master-Slave角色
  • 异步复制
  • 同步复制

如果一个broker组有Master和Slave,消息需要从Master复制到Slave上,有同步和异步两种复制方式。

复制方式 描述 优点 缺点
同步 等Master和Slave均写成功后才反馈给客户端写成功状态 如果Master出故障,Slave上有全部的备份数据,容易恢复,消费者仍可以从Slave消费, 消息不丢失 增大数据写入延迟,降低系统吞吐量,性能比异步复制模式略低,大约低10%左右,发送单个Master的响应时间会略高
异步 只要Master写成功即可反馈给客户端写成功状态 系统拥有较低的延迟和较高的吞吐量. Master宕机之后,消费者仍可以从Slave消费,此过程对应用透明,不需要人工干预,性能同多个Master模式几乎一样 如果Master出了故障,有些数据因为没有被写入Slave,而丢失少量消息。

4.高可用机制

BrokerId
Master读、写,Slave只读
当Master繁忙或者不可用时,可以自动切换到Slave读取消息

5.NameServer协调者

image.png
5.1NameServer 的功能

NameServer 是整个消息队列中的状态服务器,集群的各个组件通过它来了解全局的信息。各个角色的机器都要定期向NameServer 上报自己的状态,超时不上报的话, NameServer 会认为某个机器出故障不可用了,其他的组件会把这个机器从可用列表里移除
NamServer 可以部署多个,相互之间独立,其他角色同时向多个NameServer机器上报状态信息,从而达到热备份的目的。
NameServer 本身是无状态的, NameServer 中的Broker 、Topic 等状态信息不会持久存储,都是由各个角色定时上报并存储到内存中的( NameServer 支持配置参数的持久化, 一般用不到)。

5.2RocketMQ为什么不使用ZooKeeper

ZooKeeper可以提供Master选举功能,比如Kafka用来给每个分区选一个broker作为leader,但对于RocketMQ来说,topic的数据在每个Master上是对等的,没有哪个Master上有topic上的全部数据,所以这里选举leader没有意义;RockeqMQ集群中,需要有构件来处理一些通用数据,比如broker列表,broker刷新时间,虽然ZooKeeper也能存放数据,并有一致性保证,但处理数据之间的一些逻辑关系却比较麻烦,而且数据的逻辑解析操作得交给ZooKeeper客户端来做,如果有多种角色的客户端存在,自己解析多级数据确实是个麻烦事情;既然RocketMQ集群中没有用到ZooKeeper的一些重量级的功能,只是使用ZooKeeper的数据一致性和发布订阅的话,与其依赖重量级的ZooKeeper,还不如写个轻量级的NameServer,NameServer也可以集群部署,NameServer与NameServer之间无任何信息同步,只有一千多行代码的NameServer稳定性肯定高于ZooKeeper,占用的系统资源也可以忽略不计

NameServer是整个集群的状态服务器
NameServer部署、相互独立
集群状态的存储结构

NameServer维护的主要信息:

    /**
     * 存储所有Topic的属性信息
     */
    private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
    /**
     *  存储BrokerName对应的属性信息
     */
    private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
    /**
     * 存储集群的信息
     */
    private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
    /**
     * 存储Broker机器的实时状态
     */
    private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
    /**
     * 存储过滤服务器信息
     */
    private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
特别感谢:

阿神

相关文章

网友评论

    本文标题:RocketMQ 6.核心原理解析

    本文链接:https://www.haomeiwen.com/subject/zmttaktx.html