RocketMQ原理及源码解析
rocketmq原理深入:
一、定义:
rocketmq是一款分布式、队列模型的消息中间件,有以下部分组成:
1、nameserver: 一个几乎无状态的节点,可集群部署,节点之间无任何信息同步
2、broker:是rocketmq的核心组成部分,通过轻量级的topic和队列机制来维护消息存储,broker支持消息push和pull模式。支持千亿级别的消息堆积能力
3、producer:消息生产者,和nameserver通信获取topic路由信息,和nameserver保持长连接以及和该生产者关联的所有broker保持长连接
4、consumer:消费者,单个消费者和一台nameserver保持长连接,定时查询topic配置信息,根据topic路由和broker保持长连接
二、broker集群方式
1、单master模式:这种方式风险较大,一旦broker 重启或者宕机时,会导致整个服务不可用,不建议线上环境使用。
2、多master模式:一个集群无 slave,全是 master,例如:3 个 master
优点:配置简单,单个master 宕机或重启维护对应用无影响,在磁盘配置为 raid10 时,即使机器宕机不可恢复情况下,由与 raid10 磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢)。性能最高。
缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到受到影响。
3、多master多slave模式、异步复制
每个 master 配置一个 slave,有多对master-slave,ha 采用异步复制方式,主备有短暂消息延迟,毫秒级。
优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为 master 宕机后,消费者仍然可以从 slave 消费,此过程对应用透明。不需要人工干预。性能同多 master 模式几乎一样。
缺点:master 宕机,磁盘损坏情况,会丢失少量消息。
4、多master多slave、同步双写
每个 master 配置一个 slave,有多对master-slave,ha 采用同步双写方式,主备都写成功,向应用返回成功。
优点:数据与服务都无单点,master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高
缺点:性能比异步复制模式略低,大约低 10%左右,发送单个消息的 rt 会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。
三、rocketmq架构图:
图片借鉴:
四、rocketmq源码分析:
1、mq功能模块:
rocketmq-remoting:通信组件模块,提供通信需要的编码解码器,主要接口:
a、remotingservice:*接口
//nettyconfig配置启动nio监听端口服务(serverbootstrap)serverbootstrap.bind().sync()
public void start();
//关闭服务端口
public void shutdown();
//注册rpc响应钩子
public void registerrpchook(rpchook rpchook);
b、remotingserver:实现remotingservice,提供注册请求处理器和调用方式
c、remotingclient:实现remotingservice,远程通信,client接口
d、channeleventlistener:提供链接,关闭,异常,空闲事件监听接口
主要接口图:
rocketmq-namesrv:对应nameserver服务实例,一些时序图:
rocketmq-broker:broker集群功能代码
brokerstartup:启动入口,提供命令参数解析,加载netty server,netty client,broker,messagestore配置初始化
brokercontroller:初始化topicmanager,consumeroffsetmanager加载offset,以及subscriptiongroupmanager加载消费组信息,messagestore加载commit log组装consumer queue建立索引
filterservermanager: 是对rocketmq-filtersrv过滤服务模块封装的接口,提供tag过滤支持
consumeroffsetmanager:消费进度管理
slavesynchronize:slave从master同步topicconfig、offset进度、delayoffset进度、subscribeptiongroup信息
subscriptiongroupmanager:用来管理订阅组,包括订阅权限等
topicconfigmanager:topic配置管理
sendmessageprocessor:处理客户端发送消息的请求
querymessageprocessor:查询消息请求处理
pullmessageprocessor:拉消息请求处理
clientmanageprocessor:client注册与注销管理
包路径信息:
broker启动流程:
rocketmq-store:存储层原理
defaultmessagestore:负责管理consumerqueue,commitlog
consumequeue:由topic和queueid组成
commitlog:负责消息存储
mapedfilequeue:存储消息对应的位置
mapedfile:消息对应磁盘位置
类图:
存储时序:
rocketmq-client:包括producer和consumer、admin
a、producer:提供了多种发送消息接口(回调,超时,指定messagequeue),相关类图:
a、consumer:包括push建立长连接后的被动消费(subscribe),以及pull拉取方式
messagemodel:集群和广播消费模式
以下是接口对比:
pull拉取时序:
push时序:最终通过pullmessageservice回调注册的回调函数pullcallback,在调用consumer注册的回调listener
上一篇: MySQL的Limit详解
推荐阅读
-
深入解析vue 源码目录及构建过程分析
-
Python openpyxl模块原理及用法解析
-
SqlServer中tempdb的日志机制原理解析及示例分享
-
Laravel框架源码解析之模型Model原理与用法解析
-
.NET Core源码解析配置文件及依赖注入
-
Java并发——结合CountDownLatch源码、Semaphore源码及ReentrantLock源码来看AQS原理
-
spring5 源码深度解析----- 被面试官给虐懵了,竟然是因为我不懂@Configuration配置类及@Bean的原理
-
Spring MVC源码(三) ----- @RequestBody和@ResponseBody原理解析
-
Mysql临时表原理及创建方法解析
-
Mybaits 源码解析 (五)----- 面试源码系列:Mapper接口底层原理(为什么Mapper不用写实现类就能访问到数据库?)