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. django基本过程

    1.Django请求生命周期 URL对应关系(匹配)--试图函数--返回用户字符串 URL对应关系(匹配)--试图函数--打开一个HTML文件 读取内容显示 return HttpResponse(' ...

  2. USACO Clumsy Cows

    洛谷 P3056 [USACO12NOV]笨牛Clumsy Cows 洛谷传送门 JDOJ 2323: USACO 2012 Nov Silver 1.Clumsy Cows JDOJ传送门 Desc ...

  3. ORA-00923: FROM keyword not found where expected

    网上搜索这类错误还是挺多的,只提供我遇到的一种情景. 本地数据库环境:Oracle10g 导入别人的项目后,有一段SQL查询总是报如下错误信息: Cause: java.sql.SQLExceptio ...

  4. eclipse scala语法用java检验 报错问题

    传送门 https://stackoverflow.com/questions/8522149/eclipse-not-recognizing-scala-code 还是 直接用eclipse的 sc ...

  5. php+ajax无刷新分页原生ajax实现分页最简单完整实例-完整代码,

    展示页面:index.html <html><script> function ajax_show() { // 获取当前页 var page =1; var xhr = ne ...

  6. 洛谷 P4427

    传送门 洛谷P4427 题意: 给你一个数,然后让你求这两个数之间的点的深度的k次方和. #思路: 很容易想到lca.因为lca可以说是求树上两个点的距离的好方法.而且lca还能遍历每一个点. 然后我 ...

  7. C++ 重写虚函数的代码使用注意点+全部知识点+全部例子实现

    h-------------------------- #ifndef VIRTUALFUNCTION_H #define VIRTUALFUNCTION_H /* * 派生类中覆盖虚函数的使用知识点 ...

  8. Flask项目之login提交

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/11/2 20:53 # @Author : zoulixiang # @Si ...

  9. 一个web请求的全过程

    参考文档:http://www.mamicode.com/info-detail-1357508.html 名词解释DNS: DNS(Domain Name System,域名系统),因特网上作为域名 ...

  10. laravel代码规范强制检查

    目录 介绍 代码规范检查与修复 在git commit时自动检查代码规范 后记 介绍 在团队协作开发中,代码规范是必要的.以前的规范都是自己定,然后手动检查,很难做到有效的约束. 现代的PHP,则有得 ...