前言

前面我们跟大家聊了聊什么是消息中间件,以及哪些场景使用哪些消息中间件更加合适。

我们了解到RocketMQ是java语言开发的,我们能更深入的阅读源码了解它的底层原理,而且它具有优秀的消息中间件高级功能。再换个角度想,对于面试MQ来说,其实我们需要深入的了解一个中间件来与面试官聊,其他的中间件了解基本原理就可以了(后文会讲解)。

所以接下来我们就以RocketMQ为敲门砖,一点一点了解MQ的奥秘。

今天我们来聊一聊RocketMQ 的架构原理

RocketMQ是如何承受高并发的呢?

先聊一聊RocketMQ是怎么实现高并发的呢,我们先从它的单机模式说起。

之前我们说过,单机的RocketMQ可以承受十万多的并发,那么这个时候如果业务上突然出现了几十万的并发量,这时候如何处理呢。

没关系,RocketMQ是支持集群化部署的,部署多台机器,每台机器承受十万的并发不就可以了吗。

其实这就是RocketMQ承受高并发的原理,当然,关于它是如何将流量分配到集群的每台机器上,这个问题以后会单独讲解,今天主要聊一聊总体的架构原理。

RocketMQ是如何存储大量消息数据的呢?

现在我们来看看,RocketMQ是如何持久化数据的。MQ收到大量消息后,这些消息是不能实时消费掉的,所以就会存在消息的积压,同时为了保证消息不丢失,所以持久化是很必要的。

而对于海量的消息,单独一台机器是存储不下的。退一步来讲,就算能够存储的下,一旦这台机器坏掉,数据就丢失了,无法保证消息的可靠性。

其实对于消息数据的持久化,和高并发的解决方案是类似的,看下图:

假设一共有一万条消息要发送给MQ,分散到10台机器,可能每台机器就会收到1000条左右的消息,这时候MQ会把发送到自己机器的消息保存到自己的磁盘里,其实就是数据的分布式存储。

所谓分布式存储就是把数据分散到多台机器存储,可以通过扩展机器存储海量数据。

如果RocketMQ挂掉了怎么办?

在讨论这个问题之前,我们先引入一个新的概念,Broker。

Broker是RocketMQ的核心模块,负责接收并存储消息,同时提供Push/Pull接口来将消息发送给consumer。Consumer可选择从Master或者Slave读取数据。多个主/从组成Broker集群,集群内的Master节点之间不做数据交互。Broker同时提供消息查询的功能,可以通过MessageID和messageKey来查询消息。Borker会将自己的topic配置信息实时同步到NameServer。
 
一定有小伙伴会问,上边又出现了一个新名词NameServer,那什么是NameServer呢?不要急,下一章节会有介绍。
 
至于Producer(生产者)、Consumer(消费者),相信小伙伴们已经了解了,就是消息的生产服务和消费服务,不多做介绍。
 
了解了这些概念后我们再重新讨论我们的主题,RocketMQ挂掉了怎么办
 
Rocket对此的解决方案是Broker主从架构以及多副本策略,上边介绍Broker的时候我们也说了,它是有主从的,我们看下图:
 

Master Broker收到消息后会同步给Slave Broker,这样Slave Broker就有了一份副本数据,

这样,当RocketMQ挂掉了一个Broker,还有一份副本Broker可以继续提供服务,这就保证了系统的高可用性。

如何知道我该访问哪个Broker?
 
上边我们发现,Broker可以部署一个庞大的集群,还可以部署多个Slave做副本实现高可用,那么对于要调用MQ服务的系统来讲,是如何知道它应该访问那个Broker的呢?
 
这时候就要谈谈NameServer了。
 
NameServer可以看作是RocketMQ的注册中心,它也是可以独立部署集群的,它管理两部分数据:集群的Topic-Queue的路由配置;Broker的实时配置信息。其它模块通过NameServer提供的接口获取最新的topic配置和路由信息。
 
玩过Spring Cloud分布式系统的小伙伴们是不是觉得它很熟悉,没错它就是注册中心,功能类似于Euraka,每个Broker都会向它注册自己的信息,我们看下图:

对于系统而言(无论是生产者还是消费者),要调用MQ服务,首先会去NameServer中获取路由信息,也会知道系统中有哪些Broker正在提供服务,从而确定自己应该访问哪台机器上的Broker。

RoketMQ的基本架构原理就是这样了,当然这只是个总体的架构,很多细节的东西都可以去深入探索,欢迎小伙伴们关注后续的文章,和HUC王子一起细嚼慢咽,探索消息中间件的乐趣吧。

往期文章推荐:

什么是消息中间件?主要作用是什么?

常见的消息中间件有哪些?你们是怎么进行技术选型的?

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2dl7u9oadykgw

你懂RocketMQ 的架构原理吗?的更多相关文章

  1. RocketMQ(1)-架构原理

    RocketMQ(1)-架构原理 RocketMQ是阿里开源的分布式消息中间件,跟其它中间件相比,RocketMQ的特点是纯JAVA实现:集群和HA实现相对简单:在发生宕机和其它故障时消息丢失率更低. ...

  2. RocketMQ(1)---架构原理及环境搭建

    一.架构简述 RocketMQ阿里开源的一个分布式消息传递和流媒体平台,具有低延迟,高性能和可靠性, 万亿级容量和灵活的可伸缩性.跟其它中间件相比,RocketMQ的特点是纯JAVA实现,在发生宕机和 ...

  3. RocketMQ架构原理解析(四):消息生产端(Producer)

    RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...

  4. RocketMQ架构原理解析(一):整体架构

    RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...

  5. 一张图进阶 RocketMQ - 整体架构

    前 言 三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接,关于 RocketMQ 你只需要记住这张图!如果你第一次看到这个系列,墙裂建议你打开链接.觉得不错的话,记得点 ...

  6. NET/ASP.NET Routing路由(深入解析路由系统架构原理)(转载)

    NET/ASP.NET Routing路由(深入解析路由系统架构原理) 阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模 ...

  7. 简单理解Hadoop架构原理

    一.前奏 Hadoop是目前大数据领域最主流的一套技术体系,包含了多种技术. 包括HDFS(分布式文件系统),YARN(分布式资源调度系统),MapReduce(分布式计算系统),等等. 有些朋友可能 ...

  8. Hbase的架构原理、核心概念

    Hbase的架构原理.核心概念 1.Hbase的表.行.列.列族 2.核心组件: Table和region Table在行的方向上分割为多个HRegion, 一个region由[startkey,en ...

  9. [Spark内核] 第38课:BlockManager架构原理、运行流程图和源码解密

    本课主题 BlockManager 运行實例 BlockManager 原理流程图 BlockManager 源码解析 引言 BlockManager 是管理整个Spark运行时的数据读写的,当然也包 ...

随机推荐

  1. luogu4443 coci 2017 Dajave

    题目 给出一个长度为2^M的排列,元素分别是0, 1, 2, ... , 2^M -1. 选择其中某个非空连续子序列,然后允许交换这个排列中某两个不同的数,然后使得这个连续子序列的所有数的按位异或(b ...

  2. 玩转 SpringBoot2.x 之整合邮件发送

    序 在实际项目中,经常需要用到邮件通知功能.比如,用户通过邮件注册,通过邮件找回密码等:又比如通过邮件发送系统情况,通过邮件发送报表信息等等,实际应用场景很多. 原文地址:https://www.mm ...

  3. 为什么 2020 还要学 Node.js

    更佳阅读体验 https://www.yuque.com/sunluyong/node 前言 前些日子刷知乎看到个 2019 年初的问题 2019年nodejs凉了吗?凉到什么程度了?才看到问题的时候 ...

  4. SpringBoot之Quartz实战

    说明:由于上篇文章我们已经讨论过springboot整合Quartz及相关配置,本次我们只说明Qrtz的增.删.改.启动.停止相关api的使用,其中涉及的其他技术,如:mybatisplus等技术以后 ...

  5. day12. 闭包

    一.概念 """ 如果内函数使用了外函数的局部变量, 并且外函数把内函数返回出来的过程,叫做闭包 里面的内函数是闭包函数 """ 二.基本语 ...

  6. 6、Java 运算符

    Java运算符按功能可分为:算数运算符.关系运算符.逻辑运算符.位运算符.赋值运算符和条件运算符. 1.算数运算符 算术运算符包括通常的加(+).减(-).乘(*).除(/).取模(%),完成整数型和 ...

  7. 谈下APP测试和WEB测试的区别

    先来讲下相同点: 1.都需要理论知识,相同的用例设计方法:边界值,等价类,错误推导法,场景法 2.同样的测试方法 验证功能是否满足需求 3.都需要检查UI  界面设计是否合理 4.性能检测  并发 吞 ...

  8. 最适合做C/C++开发的IDE

    一.Windows Windows没什么好说的了,铁定vs(下载链接:https://visualstudio.microsoft.com/zh-hans/), 因为如果不用vs,做Qt时会有奇妙的错 ...

  9. wifi渗透

    前言 本文主要讲述 家庭家庭家庭中(重要的事情说三遍,企业认证服务器的wifi一般非常非常的安全破解不来)如何破解wifi密码,破解wifi密码后的内网渗透利用(简单说明),如何设置wifi路由器更安 ...

  10. java引用数据类型之Scanner与Random

    一 Scanner类 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型  变量名  =  new 数据类型(); 每种引用数据类型都s ...