美文网首页面试精选
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