从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十三)rocketmq 篇(1):整体介绍

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: 从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十三)rocketmq 篇(1):整体介绍

e7f77255fcb74d93904146de9d1e7d82.png

rocketmq 架构设计理念和目标

设计理念


RocketMQ设计基于主题的发布与订阅模式,其核心功能包括消息发送、消息存储和消息消费,整体设计追求简单和性能高效,主要体现在如下3个方面。

首先,NameServer的设计极其简单,摒弃了业界常用的将ZooKeeper作为信息管理的“注册中心”,而是自研NameServer实现元数据的管理(topic路由信息等)。从实际需求出发,topic路由信息无须在集群之间保持强一致,而是追求最终一致性,并且能容忍分钟级的不一致。正是基于这种特性,RocketMQ的NameServer集群之间互不通信,这样极大地降低了NameServer实现的复杂度,对网络的要求也降低了不少,性能相比较ZooKeeper还有了极大的提升。

其次是高效的I/O存储机制。RocketMQ追求消息发送的高吞吐量,RocketMQ的消息存储文件被设计成文件组的概念,组内单个文件大小固定,方便引入内存映射机制,所有主题的消息存储按顺序编写,极大地提升了消息的写性能。同时为了兼顾消息消费与消息查找,引入了消息消费队列文件与索引文件。

最后是容忍存在设计缺陷,适当将某些工作下放给RocketMQ使用者。消息中间件的实现者经常会遇到一个难题:如何保证消息一定能被消息消费者消费,并且只消费一次?

RocketMQ的设计者给出的解决办法是不解决这个难题,而是退而求其次,只保证消息被消费者消费,在设计上允许消息被重复消费。这样极大地简化了消息中间件的内核,使得实现消息发送高可用变得非常简单和高效,消息重复问题由消费者在消息消费时实现幂等

设计目标

作为一款消息中间件,RocketMQ需要解决如下问题。


1. 架构模式

RocketMQ与大部分消息中间件一样,采用发布订阅模式,主要参与组件包括:消息发送者、消息服务器(消息存储)、消息消费和路由发现。


2. 顺序消息

所谓顺序消息,就是消息消费者按照消息达到消息存储服务器的顺序消费。RocketMQ可以严格保证消息有序。


3. 消息过滤

消息过滤是指在消息消费时,消息消费者可以对同一主题下的消息按照规则只消费自己感兴趣的消息。RocketMQ消息过滤是由服务端和消费端共同完成的。


4. 消息存储

消息中间件的一个核心实现是消息的存储,对于消息存储一般有如下两个维度的考量:消息堆积能力和消息存储性能。RocketMQ追求消息存储的高性能,引入内存映射机制,所有主题的消息按顺序存储在同一个文件中。同时为了避免消息在消息存储服务器中无限地累积,引入了消息文件过期机制与文件存储空间报警机制。


5. 消息高可用性

通常影响消息可靠性的有以下几种情况。

1)Broker异常崩溃。

2)操作系统崩溃。

3)机器断电,但是能立即恢复供电。

4)机器无法开机(可能是CPU、主板、内存等关键设备损坏)。

5)磁盘设备损坏。

对于前3种情况,RocketMQ在同步刷盘模式下可以确保不丢失消息,在异步刷盘模式下,会丢失少量消息。后2种情况属于单点故障,一旦发生,该节点上的消息会全部丢失。如果开启了异步复制机制,RoketMQ能保证只丢失少量消息。


6. 消息到达(消费)低延迟

RocketMQ在消息不发生堆积时,以长轮询模式实现准实时的消息推送模式。


7. 确保消息必须被消费一次


RocketMQ通过消息消费确认机制(ACK)确保消息至少被消费一次,因为ACK消息有可能出现丢失等情况,RocketMQ无法做到消息只被消费一次,所以有重复消费的可能。


8. 回溯消息

回溯消息是指消息消费端已经消费成功,根据业务要求,需要重新消费消息。RocketMQ支持按时间向前或向后回溯消息,时间维度可精确到毫秒。


9. 消息堆积

消息中间件的主要功能是异步解耦,必须能应对前端的数据洪峰,提高后端系统的可用性,这必然要求消息中间件具备一定的消息堆积能力。RocketMQ使用磁盘文件存储消息(内存映射机制),并且在物理布局上为多个大小相等的文件组成逻辑文件组,可以无限循环使用。RocketMQ消息存储文件并不是永久存储在消息服务器端的,而是提供了过期机制,默认保留3天。


10. 定时消息

定时消息是指消息发送到Broker后,不能被消息消费端立即消费,而是要到特定的时间点或者等待特定的时间后才能被消费。因为如果要支持任意精度的定时消息消费,就必须在消息服务端对消息进行排序,这势必带来很大的性能损耗,所以RocketMQ不支持任意进度的定时消息,只支持特定延迟级别。


11. 消息重试机制

RocketMQ支持消息重试机制。消息重试是指在消息消费时如果发生异常,消息中间件支持消息重新投递。

rocketmq 各个角色介绍以及之间交互流程

各个角色介绍

RocketMQ由四部分组成,先来直观地了解一下这些角色以及各自的功能。分布式消息队列是用来高效地传输消息的,它的功能和现实生活中的邮局收发信件很类似,我们类比地说一下相应的模块。现实生活中的邮政系统要正常运行,离不开下面这四个角色,一是发信者,二是收信者,三是负责暂存、传输的邮局,四是负责协调各个地方邮局的管理机构。对应到RocketMQ中,这四个角色就是Producer、Consumer、Broker和NameServer。

启动RocketMQ的顺序是先启动NameServer,再启动Broker,这时候消息队列已经可以提供服务了,想发送消息就使用Producer来发送,想接收消息就使用Consumer来接收。很多应用程序既要发送,又要接收,可以启动多个Producer和Consumer来发送多种消息,同时接收多种消息。

为了消除单点故障,增加可靠性或增大吞吐量,可以在多台机器上部署多个NameServer和Broker,为每个Broker部署一个或多个Slav

各个角色物理关系图


ceedde78e1e94e00afd03fe697ed20aa.png

各个角色逻辑关系图


24d14c7416c048328528217d269702d7.png


整体流程描述


消息客户端与NameServer、Broker的交互设计要点如下。

1)Broker每隔30s向NameServer集群的每一台机器发送心跳包,包含自身创建的topic路由等信息。

2)消息客户端每隔30s向NameServer更新对应topic的路由信息。

3)NameServer收到Broker发送的心跳包时会记录时间戳。

4)NameServer每隔10s会扫描一次brokerLiveTable(存放心跳包的时间戳信息),如果在120s内没有收到心跳包,则认为Broker失效,更新topic的路由信息,将失效的Broker信息移除。

nameserver 作用

消息中间件的设计思路一般是基于主题的订阅发布机制,消息生产者(Producer)发送某一主题的消息到消息服务器,消息服务器负责该消息的持久化存储,消息消费者(Consumer)订阅感兴趣的主题,消息服务器根据订阅信息(路由信息)将消息推送给消费者(推模式)或者消息消费者主动向消息服务器拉取消息(拉模式),从而实现消息生产者与消息消费者的解耦。为了避免因消息服务器的单点故障导致的整个系统瘫痪,通常会部署多台消息服务器共同承担消息的存储。那么消息生产者如何知道消息要发往哪台消息服务器呢?如果某一台消息服务器宕机了,生产者如何在不重启服务的情况下感知呢?

NameServer就是为了解决上述问题而设计的。

broker作用


broker 主要负责对topic 以及topic下的消息队列进行存储

其中主要是对 commitLog 以及 consumeQuene 等消息文件进行存储

另外也负责对文件信息进行内存映射,这块内容比较多,暂时不做详细介绍,有兴趣的朋友可以去了解下page cache


相关实践学习
消息队列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
相关文章
|
3天前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
1天前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
10 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
27天前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
17天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
735 9
|
15天前
|
Java 对象存储 开发者
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
37 3
|
15天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
15天前
|
存储 NoSQL Java
Spring Session框架
Spring Session 是一个用于在分布式环境中管理会话的框架,旨在解决传统基于 Servlet 容器的会话管理在集群和云环境中的局限性。它通过将用户会话数据存储在外部介质(如数据库或 Redis)中,实现了会话数据的跨服务器共享,提高了应用的可扩展性和性能。Spring Session 提供了无缝集成 Spring 框架的 API,支持会话过期策略、并发控制等功能,使开发者能够轻松实现高可用的会话管理。
Spring Session框架
|
21天前
|
Kubernetes Cloud Native Java
当 Quarkus 遇上 Spring Boot,谁才是现代云原生应用的终极之选?究竟哪款能助你的应用傲视群雄?
Quarkus 和 Spring Boot 均为构建现代云原生应用的热门框架,旨在简化开发流程并提升性能。Spring Boot 依托庞大的 Spring 生态系统,提供开箱即用的体验,适合快速搭建应用。Quarkus 由红帽发起,专为 GraalVM 和 HotSpot 设计,强调性能优化和资源消耗最小化,是云原生环境的理想选择。
21 3
|
22天前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
28 2
|
22天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应