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原理及源码解析的更多相关文章

  1. 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试

    机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...

  2. Spring-Session实现Session共享实现原理以及源码解析

    知其然,还要知其所以然 ! 本篇介绍Spring-Session的整个实现的原理.以及对核心的源码进行简单的介绍! 实现原理介绍 实现原理这里简单说明描述: 就是当Web服务器接收到http请求后,当 ...

  3. Spring MVC工作原理及源码解析(三) HandlerMapping和HandlerAdapter实现原理及源码解析

    1.HandlerMapping实现原理及源码解析 在前面讲解Spring MVC工作流程的时候我们说过,前端控制器收到请求后会调⽤处理器映射器(HandlerMapping),处理器映射器根据请求U ...

  4. Redux异步解决方案之Redux-Thunk原理及源码解析

    前段时间,我们写了一篇Redux源码分析的文章,也分析了跟React连接的库React-Redux的源码实现.但是在Redux的生态中还有一个很重要的部分没有涉及到,那就是Redux的异步解决方案.本 ...

  5. LinkedList原理及源码解析

    简介 LinkedList是一个双向线性链表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度, ...

  6. ORB原理与源码解析

    转载: http://blog.csdn.net/luoshixian099/article/details/48523267 CSDN-勿在浮沙筑高台 没有时间重新复制代码,只能一股脑的复制,所以代 ...

  7. Spring核心框架 - AOP的原理及源码解析

    一.AOP的体系结构 如下图所示:(引自AOP联盟) 层次3语言和开发环境:基础是指待增加对象或者目标对象:切面通常包括对于基础的增加应用:配置是指AOP体系中提供的配置环境或者编织配置,通过该配置A ...

  8. 【Spring】Spring IOC原理及源码解析之scope=request、session

    一.容器 1. 容器 抛出一个议点:BeanFactory是IOC容器,而ApplicationContex则是Spring容器. 什么是容器?Collection和Container这两个单词都有存 ...

  9. Go中定时器实现原理及源码解析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码15.7,需要注意的是由于timer是1.14版本进行改版,但是1. ...

随机推荐

  1. $().ready()与window.onload的不同

    1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行.         $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2 ...

  2. mybatis框架,使用foreach实现复杂结果的查询--循环集合数组

    需求:假定现在查询出用户角色是2和3指定的用户列表信息,并进行展示 接口: /** * 需求:传入指定的用户角色,用户角色有1-n,获取这些用户角色下的用户列表信息 * @param roleids ...

  3. 【MyEclipse】安装svn插件

    svn插件包下载:http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240 重启myeclipse 看import就 ...

  4. 转:ubuntu16安装python3.6并将环境设置为系统默认

    按照本文升级到3.6,但pip无法运行了,问题没有解决 1.添加python3.6安装包,并且安装 sudo apt-get install software-properties-common su ...

  5. IIS 报错 Cannot open database "test4" requested by the login. The login failed. Login failed for user 'IIS APPPOOL\test1'.

    报错: Cannot open database "test4" requested by the login. The login failed. Login failed fo ...

  6. SPA项目开发之登录注册

    CMD安装所需要的pom依赖 npm install element-ui -S npm install axios -S npm install qs -S npm install vue-axio ...

  7. 2.shell编程-函数的高级用法

    2.1.函数的定义和使用 函数基本使用 [root@VM_0_9_centos ~]# test() > {} -bash: syntax error near unexpected token ...

  8. 剑指offer15 二进制中1的个数

    题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1.因此,如果输入9则函数输出2. int Number(int n) { ; while ...

  9. C# 动态加载(转)

    原文链接地址:http://blog.csdn.net/lanruoshui/article/details/5090710 原理如下: 1.利用反射进行动态加载和调用. Assembly assem ...

  10. python 项目实战之备份文件夹并且压缩文件夹及下面的文件

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/11/12 14:21 # @Author : zoulixiang # @S ...