前言

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

我们了解到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. x86架构:从实模式进入保护模式

    详细的过程说明参考:(1)  https://www.cnblogs.com/Philip-Tell-Truth/p/5211248.html    (2)x86汇编:从实模式到保护模式 这里简化一下 ...

  2. python数据可视化编程实战PDF高清电子书

    点击获取提取码:3l5m 内容简介 <Python数据可视化编程实战>是一本使用Python实现数据可视化编程的实战指南,介绍了如何使用Python最流行的库,通过60余种方法创建美观的数 ...

  3. LSTM理解

    简介 LSTM(Long short-term memory,长短期记忆)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失问题.以下先从RNN介绍. 简说RNN RNN(Recurrent ...

  4. demo3同通讯录展示的方式分组排序

    按A-Z顺序分组展示 有些项目中会需要这样的需求.形成类似于上述的界面.类似于通讯录里边的排序.实现的效果:所有的数据展示的时候,能够分组展示.顺序按照A-Z的书序进行排列.如果不是以A-Z开头,则默 ...

  5. excel-格式处理

    问题[1]:将excl中数据导出txt,并且每列之间距离一个空格 在C1(任意空列) 输入=A1&" "&B1" "中间是一个半角英文空格下拉 ...

  6. python4.2参数传入

    #顺序传入参数def show(name,age,sex,hobby):#形参 print("我叫:",name,"年龄:",age,"性别:&quo ...

  7. 【NBA 可视化】使用Pyecharts实现湖人19-20赛季投篮数据可视化~

    前言 先来口号 「湖人总冠军」~

  8. C#设计模式之5-单例模式

    单例模式(Singleton Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/397 访问. 单例模式属 ...

  9. 树堆(Treap)学习笔记 2020.8.12

    如果一棵二叉排序树的节点插入的顺序是随机的,那么这样建立的二叉排序树在大多数情况下是平衡的,可以证明,其高度期望值为 \(O( \log_2 n )\).即使存在一些极端情况,但是这种情况发生的概率很 ...

  10. java 与 springboot

    package geektime.spring.springbucks; import geektime.spring.springbucks.model.Coffee; import geektim ...