前言

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

我们了解到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. 用大白话解释什么是Socket

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 我在去年就学习过Java中 ...

  2. 精通python网络爬虫PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取书籍提取码:yc9w

  3. day1. python注释及变量

    一.注释 1.单行注释 # # python 2.x print "你好" # python 3.x print("你好") 2.多行注释 ''' '''  或 ...

  4. 入门实践,Python数据分析

    1-2 Anaconda和Jupyter notebook介绍 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知 ...

  5. Hive: Reflect UDF

    Reflect UDF JAVA类和方法通常用于处理用户希望在hive中使用的确切的函数.相比与封装一个UDF然后调用这个方法,这些 方法主要通过反射UDF去调用.Reflect使用Java反射去实例 ...

  6. 2018-04-19:innodb和myisam区别

    福哥答案2020-04-19:

  7. IDEA 非常重要的一些设置项 → 一连串的问题差点让我重新用回 Eclipse !

    开心一刻 建筑行业内,我看过的最凶残笑话(IT行业内好一致!) 上联:一天晚上两个甲方三更半夜四处催图只好周五加班到周六早上七点画好八点传完九点上床睡觉十分痛苦 下联:十点才过九分甲方八个短信七个电话 ...

  8. LeetCode 861翻转矩阵后得分详细解法

    1. 题目内容 有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后 ...

  9. Es6扩展运算符--三点运算符(...)--展开语法(Spread syntax)

    0.看文档呀 关于拓展运算符更详细的解释见 > MDN展开语法 关于剩余参数更详细的解释见 >MDN剩余参数 关于解构赋值更详细的解释见 >MDN解构赋值 直接看上面的文档更好 1. ...

  10. PyUsb的使用记录--window中

    import usb.core import usb.util # find our device dev = usb.core.find(idVendor=0x03EB, idProduct=0x2 ...