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
RocketMQ原理及源码解析的更多相关文章
- 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试
机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...
- Spring-Session实现Session共享实现原理以及源码解析
知其然,还要知其所以然 ! 本篇介绍Spring-Session的整个实现的原理.以及对核心的源码进行简单的介绍! 实现原理介绍 实现原理这里简单说明描述: 就是当Web服务器接收到http请求后,当 ...
- Spring MVC工作原理及源码解析(三) HandlerMapping和HandlerAdapter实现原理及源码解析
1.HandlerMapping实现原理及源码解析 在前面讲解Spring MVC工作流程的时候我们说过,前端控制器收到请求后会调⽤处理器映射器(HandlerMapping),处理器映射器根据请求U ...
- Redux异步解决方案之Redux-Thunk原理及源码解析
前段时间,我们写了一篇Redux源码分析的文章,也分析了跟React连接的库React-Redux的源码实现.但是在Redux的生态中还有一个很重要的部分没有涉及到,那就是Redux的异步解决方案.本 ...
- LinkedList原理及源码解析
简介 LinkedList是一个双向线性链表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度, ...
- ORB原理与源码解析
转载: http://blog.csdn.net/luoshixian099/article/details/48523267 CSDN-勿在浮沙筑高台 没有时间重新复制代码,只能一股脑的复制,所以代 ...
- Spring核心框架 - AOP的原理及源码解析
一.AOP的体系结构 如下图所示:(引自AOP联盟) 层次3语言和开发环境:基础是指待增加对象或者目标对象:切面通常包括对于基础的增加应用:配置是指AOP体系中提供的配置环境或者编织配置,通过该配置A ...
- 【Spring】Spring IOC原理及源码解析之scope=request、session
一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...
- Go中定时器实现原理及源码解析
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码15.7,需要注意的是由于timer是1.14版本进行改版,但是1. ...
随机推荐
- V4L2 API详解 Buffer的准备和数据读取
1. 初始化 Memory Mapping 或 User Pointer I/O. int ioctl(int fd, int requestbuf, struct v4l2_requestbuffe ...
- Mybatis-plus中不列出全部字段
//不列出全部字段 @Test public void test10() { QueryWrapper<User> wrapper = new QueryWrapper<>() ...
- libpcap工具包使用go交叉编译开发android
命令使用 libpcap交叉编译 cd /tmpwget http://www.tcpdump.org/release/libpcap-1.8.1.tar.gztar xvf libpcap-1.8. ...
- Codeforces Round #609 (Div. 2) A到C题
签到,乘以两个相邻的合数 #include<bits/stdc++.h> using namespace std; int main(int argc, char const *argv[ ...
- docker 搭建自己的仓库
1.下载registry镜像 docker pull registry 2.查看端口信息 netstat -ntlp 3.启动registry镜像 docker run -d -p 5000:5000 ...
- USACO Hide and Seek
洛谷 P2951 [USACO09OPEN]捉迷藏Hide and Seek 洛谷传送门 JDOJ 2641: USACO 2009 Open Silver 1.Hide and Seek JDOJ传 ...
- 【神经网络与深度学习】chainer边运行边定义的方法使构建深度学习网络变的灵活简单
Chainer是一个专门为高效研究和开发深度学习算法而设计的开源框架. 这篇博文会通过一些例子简要地介绍一下Chainer,同时把它与其他一些框架做比较,比如Caffe.Theano.Torch和Te ...
- cad.net 2008使用WPF(摘录山人)
由于WPF的优点多多,而且在大量的winform的操作下感觉到数据操作的麻烦....推荐大家看杨中科WPF数据绑定教程 https://www.bilibili.com/video/av3388348 ...
- Angular Material
Angular Material 的设计之美 Ng-Matero 0.3 已发布,新增 module schematic 以及 page schematic,详见 README 前言 Angula ...
- GTD时间管理
GTD就是Getting Things Done的缩写,翻译过来就是"把事情处理完",是一个管理时间的方法.GTD的核心理念概括就是必须记录下来要做的事,然后整理安排并使自己一一去 ...