热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RocketMQ原理:RocketMQ架构

​本章主要介绍RocketMQ的基本架构,并对其中的NameServer、Broker、Producer、Customer这四个核心

本文首发于Ressmix个人站点:https://www.tpvlog.com

本章,我们先来看下RocketMQ的基本架构,涉及哪些核心组件,以及各个组件之间的关系又是怎样的。

一、基本架构

在RockectMQ中,一共有四个核心组件:NameServerBrokerProducerCustomer,它们之间的基本关系可以用RocketMQ官方的一张图表示:

上图中,Broker Cluster就是各个RocketMQ进程,Producer Cluster和Consumer Cluster分别是生产者和消费者,NameServer Cluster是路由中心。

看不懂?没关系,我们下面将一一分析上述的各个组件。

1.1 Broker

我们在每台机器上部署的RocketMQ进程,就称为Broker。Broker主要负责消息的存储,一般来说,在一台配置好一点的机器上部署单个Broker实例后,可以抗大约10万QPS的请求。

我们可以看上图,Broker本身可以构建成一个集群,我们的所有消息数据是以数据分片的形式分布在各个Broker节点上,也就是每个Broker节点保存总数据的一部分。此外,为了保证集群的可用性,每个Broker节点都有自己的副本(Slave),它们之间会进行数据同步。

Broker集群的整个架构就是我们在分布式篇中讲过的数据分散集群架构Master/Slave架构的结合。

1.2 NameServer

NameServer是RocketMQ的路由中心,每一个NameServer节点都保存着全量的路由信息。因为Broker是集群部署,所以当生产者发送消息时,需要知道将消息发送到哪个Broker,当消息者获取消息时,也需要知道从哪个Broker获取消息。

每一个Broker节点(包括Slave)都会通过心跳机制(TCP长连接),将自己的基本信息注册到每一个NameServer中,这样Producer和Consumer就可以从NameServer拉取到路由消息。

默认情况下,每个Broker会每隔30s给所有的NameServer发送心跳,告诉NameServer自己还活着;与此同时,每个NameServer每隔10s检查一下各个Broker的最近一次心跳时间,如果发现某个Broker超过120s都没发送心跳,就认为这个Broker已经挂掉了,会将其从路由信息里移除。

所谓的路由信息,可以理解为Broker集群里的各个Broker的自身信息。

1.3 Producer

生产者,用于生产消息,会定时从NameServer拉取路由信息,然后根据路由信息与指定的Broker建立TCP长连接,从而将消息发送到Broker中。

1.4 Consumer

消费者,用于消费消息,会定时从NameServer拉取路由信息,然后根据路由信息与指定的Broker建立TCP长连接,从而从Broker拉取消息。

二、高可用

了解完RocketMQ的基本架构后,我们先来看看RocketMQ是如何实现高可用的。由于Producer和Consumer是直接与我们的客户端程序相关的,可用性由我们自己来保证,所以重点看下NameServer和Broker。

2.1 NameServer的可用性

NameServer管理着Broker的基本信息,如果NameServer挂掉了,那么生产者和消费者就找不到Broker了,所以NameServer需要以集群方式部署来实现高可用。在RocketMQ中,每个NameServer都保存着Broker集群的所有Broker信息,所以就算一台NameServer服务器宕机了,还有其它NameServer可用。

2.2 Broker的可用性

每个Broker节点都是主从架构,所以就算主节点宕掉了,从节点依然可以提供服务。但这里就要思考两个问题:

  1. 主从节点之间如何进行数据同步?

  2. RokectMQ是否具有故障自动转移机制(即主节点挂掉后,从节点自动成为主节点,不需要人工介入)?

对于第一点,每一个Slave-Broker节点都会去自己的Master节点那里拉取数据,以进行同步;

对于第二点,在RocketMQ4.5版本以前,如果Master节点挂掉了,需要手动选出一个Slave节点重新作为Master节点,效率很低。所以4.5版本后,RocketMQ引入了Dleger机制,采用Raft协议进行主从节点的选举,实现故障自动转移。

关于Raft协议,读者可以参考我的《分布式系统从理论到实战系列》,我也会在进阶篇中对Dleger机制的原理做详细讲解。

三、可扩展

RocketMQ之所以具有可扩展性,是因为每个Broker节点只保存整体数据的一部分,这样当数据量越来越大时,可以进行水平切分。如果读者对RabbitMQ有所了解就知道,RabbitMQ中的每个节点保存着全量数据,那么当数据量越来越大时,是没法水平扩展的,而RocketMQ通过数据分散集群的模式实现了水平扩展。

3.1 Topic和Tag

在RocketMQ中,每一个消息都有其所属的Topic,所谓Topic,就是数据集合的意思,是一个逻辑概念。

举个例子,假设我们的订单系统需要往MQ里发送订单消息,那此时就应该建立一个Topic,它的名字可以叫做:topic_orderInfo,也就是一个包含了所有订单消息的数据集合。然后生产者发送消息时,就必须指定好消息所属的Topic,消费者消费消息时,也需要指定从哪个Topic里获取消息。

Broker在存储消息时,每一个Topic中的所有消息数据可能会分散在不同的Broker节点上,我们可以在创建Topic时进行指定。比如,假设我们的topic_orderInfo包含900万条消息,我们指定其分散在3个Broker节点上,那么每个节点就包含300万条消息数据:

除了Topic外,还有一个Tag分类,区分在于 Topic 是一级分类,而 Tag 可以理解为是二级分类。

那到底什么时候该用 Topic,什么时候该用 Tag?建议如下:

  • 消息类型是否一致:如普通消息、事务消息、定时(延时)消息、顺序消息,不同的消息类型使用不同的 Topic,无法通过 Tag 进行区分;

  • 业务是否相关联:没有直接关联的消息,如淘宝交易消息,京东物流消息使用不同的 Topic 进行区分;而同样是天猫交易消息,电器类订单、女装类订单、化妆品类订单的消息可以用 Tag 进行区分。

  • 消息优先级是否一致:如同样是物流消息,盒马必须小时内送达,天猫超市 24 小时内送达,淘宝物流则相对会慢一些,不同优先级的消息用不同的 Topic 进行区分。

  • 消息量级是否相当:有些业务消息虽然量小但是实时性要求高,如果跟某些万亿量级的消息使用同一个 Topic,则有可能会因为过长的等待时间而“饿死”,此时需要将不同量级的消息进行拆分,使用不同的 Topic。

每个Broker都通过心跳机制告诉NameServer:我这里有哪些类型的Topic,每类Topic的哪些数据保存在我这。所以生产者才会知道向哪个Broker发送消息,消费者同理。

另外要注意:生产者只能往Master-Broker节点发送消息,消费既可以从Master-Broker节点消费消息,也可以从Slave-Broker节点消费消息,这个我们后面讲解Broker持久化原理时会详细介绍。

四、总结

本章,我们介绍了RocketMQ的基本架构,并对其中的NameServerBrokerProducerCustomer这四个核心组件进行了简要讲解。RocketMQ实现高可用和可扩展的思路其实没什么新意,就是基于Raft协议的主从架构,以及数据分散集群模式。

如果读者对Spring Cloud有所了解,就会发现,RocketMQ的基本架构和Spring Cloud中的很多组件非常相似,比如NameServer,其实就是类似于Spring Cloud中的Eureka服务注册中心,读者也可以结合我的《分布式系统从理论到实战系列》进行比较。




推荐阅读
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • ZeroMQ在云计算环境下的高效消息传递库第四章学习心得
    本章节深入探讨了ZeroMQ在云计算环境中的高效消息传递机制,涵盖客户端请求-响应模式、最近最少使用(LRU)队列、心跳检测、面向服务的队列、基于磁盘的离线队列以及主从备份服务等关键技术。此外,还介绍了无中间件的请求-响应架构,强调了这些技术在提升系统性能和可靠性方面的应用价值。个人理解方面,ZeroMQ通过这些机制有效解决了分布式系统中常见的通信延迟和数据一致性问题。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 从用户转型为开发者:一场思维升级的旅程 | 专访 StarRocks Committer 周威
    从用户转变为开发者,不仅是一次角色的转换,更是一场深刻的思维升级之旅。本次专访中,StarRocks Committer 周威分享了他如何在这一过程中逐步提升技术能力与思维方式,为开源社区贡献自己的力量。 ... [详细]
  • 优化后的标题:PHP分布式高并发秒杀系统设计与实现
    PHPSeckill是一个基于PHP、Lua和Redis构建的高效分布式秒杀系统。该项目利用php_apcu扩展优化性能,实现了高并发环境下的秒杀功能。系统设计充分考虑了分布式架构的可扩展性和稳定性,适用于大规模用户同时访问的场景。项目代码已开源,可在Gitee平台上获取。 ... [详细]
  • openGauss行存储核心架构及其页面组织详解
    行存储的核心架构和页面组织是实现DML操作、可见性判断及多种管理功能的基础。作为基于磁盘的存储引擎,行存储在设计上采用了段页式结构,以优化数据的存储和访问效率。这种设计不仅确保了数据的高效存储,还为行存储的各种高级功能提供了坚实的技术支持。 ... [详细]
  • 智能制造数据综合分析与应用解决方案
    在智能制造领域,生产数据通过先进的采集设备收集,并利用时序数据库或关系型数据库进行高效存储。这些数据经过处理后,通过可视化数据大屏呈现,为生产车间、生产控制中心以及管理层提供实时、精准的信息支持,助力不同应用场景下的决策优化和效率提升。 ... [详细]
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 全面解析:Hadoop技术栈中的Linux操作系统概览
    全面解析:Hadoop技术栈中的Linux操作系统概览 ... [详细]
  • Java 零基础入门:SQL Server 学习笔记(第21篇)
    Java 零基础入门:SQL Server 学习笔记(第21篇) ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
author-avatar
Liushan2502897753
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有