9个问答牢记RocketMQ架构

简介: RocketMQ是Java兄弟们常用的消息中间件,虽说常用,但对于RocketMQ架构经常忘记。究其原因就2点:忙于业务开发然后长时间不看则忘了、不理解架构设计的根本原因记不牢。本文用大白话描述架构设计过程,牢记RocketMQ架构。

RocketMQ是Java兄弟们常用的消息中间件,虽说常用,但对于RocketMQ架构经常忘记。究其原因就2点:忙于业务开发然后长时间不看则忘了、不理解架构设计的根本原因记不牢。本文用大白话描述架构设计过程,牢记RocketMQ架构。

一、架构的思考过程

首先,在记框架的原理和架构时,要先把握全局的脉络,在思考为什么这么设计,最后才是思考细节,这样才能记得牢。本文通过层层追问的方式,一步步解说RocketMQ架构设计的原因。

1、基本形态

1、如果你是RocketMQ的开发者,让你来设计一个消息中间件,你会设计哪些角色?

:起码要设计3个角色:

  • 消息中转站:Broker,Broker是核心,负责:接受消息、存储消息、处理消费者的消费请求、备份容灾等。
  • 生产者:Producer,生产消息然后投递到Broker。
  • 消费者:Consumer,从Broker中消费消息。

2、消息怎么存

2、有了基本形态后,我们知道,具体的消息肯定是存在Broker里,那消息在Broker里应该怎么存储呢?

:这里借鉴实际生活中的案例,比如物流公司在发快递时,发往同一个城市的快递,肯定安排在一起,然后用同一批货车运往那个城市,这样整个物流体系运转是最高效的。这里就用到了聚类的方式,让相似的事物聚到一起。

同样的,在设计怎么存储消息时,也用到聚类的概念,我们把相同类型的消息,放到一个逻辑空间里,这个逻辑空间就是主题Topic

3、那Topic的内部又是什么结构呢?

:Topic的内部肯定是一个个的消息对象,那这些消息对象是以什么数据结构存在一起的呢?先发的消息,尽量要保证先被消费到,这里就用到了先进先出的数据结构-队列,这就是消息队列MessageQueue。所以,Topic内部是由MessageQueue组成,消息队列内部存放着一个个的消息对象。

3、引入集群

4、我们知道Broker是RocketMQ的核心,这么重要的核心挂了怎么办?

:既然是RocketMQ的核心,肯定要保证高可用不能挂,所以RocketMQ 会部署多台 Broker 组成一个集群对外提供服务。

4、再说消息怎么存

5、RocketMQ为了保障高可用,会部署多台Broker组成集群,那么集群场景下有多台机器,Topic怎么存呢?

:我们要学习毛主席的思想,“鸡蛋不能放在一个篮子里”。既然是要存大量的消息,又有多台Broker,为了分担单台机器性能压力、分担存储容量压力、保证数据容灾,所以将不同的Topic存储到不同的Broker里。

还是按照上面物流的例子说明,比如从北京发往南京的快递,肯定用同一批货车运送,快递少则用一辆货车,快递多则用多辆货车,快递被划分到了多个货车上。同样的,RocketMQ里的Topic也是分散存储在多台 Broker 上的,每台Broker上存储的消息内容是不同的。

6、如果不同的Topic存储在不同的Broker里,可能某个topic数据太大了,出现数据倾斜直接干爆某个Broker怎么办?

:上面我们提到,Topic实际上是一个个队列的集合,那只需要将队列分散存储到不同的Broker上就行了。

7、如果不同的Topic分散存储在不同的Broker里,还是有数据丢失的风险,只不过某个topic丢失的数据变小而已,这种情况的数据容灾备份怎么做呢?

:这时候就会用到Broker的主-从架构,Broker按角色分为Master和Slave,主从之间会定期地进行数据同步。Master 负责响应客户端的读写请求、存储消息、处理消费者请求等,而 Slave 只负责同步 Master 的数据。

5、说说NameServer

8、Broker既然是集群,那生产者在投递消息时,总得知道有哪些Broker吧,总得知道要往哪个Broker里投递消息吧,这又要怎么做呢?

:RocketMQ引入了NameServer的概念,NameServer相当于大管家,RocketMQ里的所有基础信息它都知道。NameServer 存储了RocketMQ 集群的元数据。NameServer 中存放的元数据主要有:

  • 集群里都有哪些Broker?
  • 有哪些生产者?
  • 有哪些消费者?
  • 集群里都有哪些 Topic?
  • 这些 Topic 的消息队列分别存在哪些 Broker 上?

9、那Nameserver如何知道这些消息呢?

:类似古时候某个人去府里当差,当差之前要把自己的所有信息登记在册。同样的,Broker、Producer、Consumer在启动时也会将数据注册到 NameServer。

Broker 在启动时会将自己注册到 NameServer 上,通过心跳持续更新元数据。同样的,Producer、Consumer也会和NameServer建立连接、动态交互集群中的数据,这样即方便上报自己的信息和也方便获取集群里的其他信息。

至此,RocketMQ的架构图已经成型,每一个部件这么设计的原因也很清晰。

二、总结

RocketMQ里的核心角色有4个:Broker、Producer、Consumer、NameServer,消息存储的核心对象有2个:Topic、MessageQueue。

为了保证数据不丢失 和 数据不倾斜,同一个Topic里的MessageQueue会分散存储在不同的Broker里。

本篇完结!感谢你的阅读,欢迎点赞 关注 收藏 私信!!!

原文链接:https://mp.weixin.qq.com/s/L9lYIp3AMaXc6CRgVmsPEw

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
28天前
|
消息中间件 存储 Java
RocketMQ(一):消息中间件缘起,一览整体架构及核心组件
【10月更文挑战第15天】本文介绍了消息中间件的基本概念和特点,重点解析了RocketMQ的整体架构和核心组件。消息中间件如RocketMQ、RabbitMQ、Kafka等,具备异步通信、持久化、削峰填谷、系统解耦等特点,适用于分布式系统。RocketMQ的架构包括NameServer、Broker、Producer、Consumer等组件,通过这些组件实现消息的生产、存储和消费。文章还提供了Spring Boot快速上手RocketMQ的示例代码,帮助读者快速入门。
|
3月前
|
消息中间件 存储 Java
RabbitMQ 在微服务架构中的高级应用
【8月更文第28天】在微服务架构中,服务之间需要通过轻量级的通信机制进行交互。其中一种流行的解决方案是使用消息队列,如 RabbitMQ,来实现异步通信和解耦。本文将探讨如何利用 RabbitMQ 作为服务间通信的核心组件,并构建高效的事件驱动架构。
137 2
|
2月前
|
消息中间件 弹性计算 运维
云消息队列RabbitMQ 版架构优化评测
云消息队列RabbitMQ 版架构优化评测
65 6
|
3月前
|
网络协议 Java 物联网
MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图
MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图
802 2
|
3月前
|
消息中间件 Java RocketMQ
微服务架构师的福音:深度解析Spring Cloud RocketMQ,打造高可靠消息驱动系统的不二之选!
【8月更文挑战第29天】Spring Cloud RocketMQ结合了Spring Cloud生态与RocketMQ消息中间件的优势,简化了RocketMQ在微服务中的集成,使开发者能更专注业务逻辑。通过配置依赖和连接信息,可轻松搭建消息生产和消费流程,支持消息过滤、转换及分布式事务等功能,确保微服务间解耦的同时,提升了系统的稳定性和效率。掌握其应用,有助于构建复杂分布式系统。
67 0
|
4月前
|
消息中间件 存储 缓存
架构设计篇问题之消息队列(MQ)在微服务系统中问题如何解决
架构设计篇问题之消息队列(MQ)在微服务系统中问题如何解决
|
5月前
|
消息中间件 存储 SQL
RocketMQ与Kafka架构深度对比
RocketMQ与Kafka架构深度对比
|
6月前
|
消息中间件 存储 Apache
MQ产品使用合集之有RocketMQ arm架构的镜像吗
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
324 1
|
6月前
|
消息中间件 Java RocketMQ
Spring Cloud RocketMQ:构建可靠消息驱动的微服务架构
【4月更文挑战第28天】消息队列在微服务架构中扮演着至关重要的角色,能够实现服务之间的解耦、异步通信以及数据分发。Spring Cloud RocketMQ作为Apache RocketMQ的Spring Cloud集成,为微服务架构提供了可靠的消息传输机制。
253 1
|
6月前
|
消息中间件 存储 数据库
RabbitMQ入门指南(二):架构和管理控制台的使用
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了RabbitMQ架构和管理控制台的使用等内容。
187 0
RabbitMQ入门指南(二):架构和管理控制台的使用