前言

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

我们了解到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. luogu P5558 心上秋

    LINK:心上秋 唐多令 宋 吴文英 何处合成愁.离人心上秋.纵芭蕉,不雨也飕飕.都道晚凉天气好,有明月,怕登楼. 年事梦中休.花空烟水流.燕辞归,客尚淹留.垂柳不萦裙带住.漫长是,系行舟. 心上秋 ...

  2. linux条件测试操作(test)和if判断语句,while循环语句,break控制语句和for循环和case多分枝语句和select语句

    条件测试操作 条件测试是专为影响"$?"的操作,是条件转移.循环语句的基础   test测试命令: test 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0, ...

  3. Python机器学习及实践_从零开始通往KAGGLE竞赛之路PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:i5nw Python机器学习及实践面向所有对机器学习与数据挖掘的实践及竞赛感兴趣的读者,从零开始,以Python编程语言为基础,在不涉及大量数学模型与复杂编程知识的前提下,逐步带领读 ...

  4. 初步理解@Transactional注解

    在SSM项目中,经常在业务层的类或者方法上看到@Transactional注解,只是知道这个注解的作用是进行事务管理,但是具体有哪些属性,在什么情况下进行回滚,确是不那么清楚.所以在网上看了一些视频和 ...

  5. Linux常用命令之文件查找which、find、locate命令讲解

    在之前的课程中,我们介绍了Linux系统的常用文件处理命令和权限管理命令,今天我们继续来学习Linux操作系统的其他处理命令. 1.文件搜索命令 which 命令解释 命令名称:which 命令所在路 ...

  6. 教你看懂Docker和K8S!

    转载于 https://my.oschina.net/jamesview/blog/2994112 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要 ...

  7. Tomcat Windows 开机自启

    在命令提示符中,进入 tomcat 的 bin 目录,执行命令,注册服务 service.bat install 在"服务"中,将 tomcat 服务设为自动

  8. 【Java】AES加机解密工具类代码

    import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypt ...

  9. CSS 定位总结

    目录 元素显示模式 元素模式 元素显示模式转换 CSS定位机制 静态定位static 相对定位relative 绝对定位absolute 固定定位fixed 粘性定位sticky 定位小结一图流 CS ...

  10. VSCode 自定义Vue snippets, 快速生成Vue模板

    命令行 Ctrl+Shift+P # 选择 Configure User Snippets # 选择 Vue.json 原始的Vue.json { // Place your snippets for ...