【每日八股】学习 RocketMQ Day2:进阶(一)

文章目录

  • 复习昨日内容
    • 为什么要使用消息队列
    • 为什么选择 RocketMQ
    • RocketMQ 的优缺点?
    • 谈谈你对 RocketMQ 的理解?
    • 消息队列有哪些类型?
    • RocketMQ 采用哪种消息队列模型?
    • 消息的消费模式了解吗?
    • 了解 RocketMQ 的基本架构吗?
    • 详细解释一下 RocketMQ 基本架构中四个构成部分的作用?
  • 学习 RocketMQ Day2:进阶(一)
    • 如何保证消息的可用性/可靠性/不丢失呢?
    • 如何处理消息重复的问题呢?

复习昨日内容

为什么要使用消息队列

消息队列是大规模分布式系统中非常常用的一项中间件技术,它的具体应用场景有:确保可靠性、服务解耦、消息异步、削峰填谷。

解耦
在分布式系统中,服务提供方可以作为生产者将服务响应打包为消息事件,发送到消息队列当中,服务需求方从消息队列中消费事件,这样可以完成服务上下游的解耦,避免服务调用链上的某一环出错而导致服务雪崩。

消息异步
系统中耗时的工作可以打包为消息事件并放到 MQ 当中,由消费者异步消费事件,发送到 MQ 之后可以快速响应用户请求。比较典型的消息异步例子是:用户新建订单后,将商品服务和库存服务的调用交由 MQ 异步处理。

削峰
削峰是 MQ 尤其是 RocketMQ 最典型的应用场景。通过 MQ,可以将瞬时的高流量转化为持续的中低等流量,从而保护系统不被瞬时高流量冲垮。具体来说,大量用户请求到达系统后,将用户请求打包为消息事件交由 MQ,并快速响应用户请求。MQ 中的消息按顺序排队,从而达到削峰的效果。

为什么选择 RocketMQ

RocketMQ 具有低延迟、高吞吐量、高可用性等特点,非常适用于并发量大、实时性要求高的场景。

RocketMQ 的优缺点?

优点

  • 单机吞吐量:十万级;
  • 可用性:非常高,基于分布式架构,方便拓展;
  • 消息可靠性:经过参数优化配置,可以做到 0 丢失;
  • RocketMQ 支持 10 亿级别的消息堆积,不会因为消息堆积导致性能下降;
  • 阿里出品,经过双十一等多轮电商场景的考验,稳定性值得信赖。

缺点

  • 基于 Java 开发,对其他客户端的支持性较差;
  • 系统迁移需要大量代码。

谈谈你对 RocketMQ 的理解?

RocketMQ 是一款可靠性强,可用性高,适用于并发量高,吞吐量大场景的消息队列中间件,主要由 NameServer、Broker、Producer 和 Consumer 四部分组成。

RocketMQ 的优势在于低毫秒延迟亿级消息堆积能力事务消息顺序消息支持,通过主从结构、数据分片和零拷贝技术保障高吞吐和可靠性,尤其适合电商和金融交易这类高吞吐以及强一致的场景。

对比 Kafka,RocketMQ 支持事务且实时性更好;对比 RabbitMQ,RocketMQ 胜在分布式拓展能力以及海量消息的处理能力。

消息队列有哪些类型?

消息队列可以分为队列模型发布-订阅模型

队列模型指的就是 Producer 将消息放在队列当中,由 Consumer 进行消费。一旦 Consumer Group 中有一个 Consumer 将消息消费了,那么这个消息就不存在了,消费者之间是竞争关系。队列模型较为简单,是最基本的 MQ 模型。

发布-订阅模型中进一步引入了发布者(Publiser)、订阅者(Subscriber)以及主题(Topic)这三个概念。发布者负责生产和发送消息,它不直接将消息发送给订阅者,而是发送给消息队列组件;订阅者会接收所订阅主题的所有消息;主题是消息的分类或通道,发布者将消息发送到特定主题,订阅者从特定的主题接收消息。

发布-订阅模型的工作原理可以概括为:订阅者向消息系统注册一个或多个感兴趣的主题,发布者将消息发送到特定主题,消息系统负责将消息传递给所有订阅了该主题的订阅者,每个订阅者独立接收消息,彼此之间互不影响,也就是说一份消息可以被多次消费

RocketMQ 采用哪种消息队列模型?

RocketMQ 采用发布-订阅模型。

RocketMQ 的消息模型在逻辑上包含多个核心组件,它们的协同工作构成了完整的消息系统。具体来说:
1. 基础消息单元:由 Message 以及 Message 的 Tag 构成。

  • Message:消息传输的最小单位;
  • Tag:Message 的二级分类(可以不指定 Tag),比如可以将一条发送给 Trade Topic 的 Message 进一步细分为 Payment / Refund …

2. 消息组织单元

  • Topic(主题):消息的一级分类,是消息的逻辑通道。生产者在发送消息时,必须指定消息的 Topic。同时,Topic 也是消费者订阅的基本单位。
  • Queue(队列):Queue 是消息实际存放的物理存储分片,每个 Topic 默认包含 4 个 Queue。生产者向 Topic 写入消息时,消息会均匀分布到某个 Queue,即** Message 会通过某种调度策略落到单个 Queue 当中**。Queue 是实现并行消费和水平拓展的基础。

3. 消费相关组件

  • Consumer Group(消费者组):消费者组是一组行为相同的消费者的逻辑集合。消费者组的消费模式有两种,分别是集群模式和广播模式。不同消费者组独立消费进度。
  • Producer Group(生产者组):生产者组是一组行为相同的生产者。

4. 消费位置管理

  • Offset(偏移量):标识消费者在 Queue 当中的消费进度。

消息的消费模式了解吗?

消息消费模式有两种:集群模式广播模式

默认情况下,消费者组采用集群消费,也就是一个消费者组当中的消费者竞争的消费 Topic 下的一条消息,一旦一条消息被消费过了,就不能重复消费了。

广播消费模式指的是 Topic 下的每一份消息都会发送给消费者组当中的每一个消费者消费一次。

了解 RocketMQ 的基本架构吗?

RocketMQ 的基本架构分为四部分,分别是 NameServer、Broker、Consumer 和 Producer。四者都采用集群模式部署,方便在分布式系统中快速地拓展。

详细解释一下 RocketMQ 基本架构中四个构成部分的作用?

NameServer
NameServer 是无状态(这里的「无状态」指的是 NameServer 仅存储最基本的路由元信息,所有数据的状态都是临时的,不会被持久化,而是仅存储在内存当中)服务器,角色类似于 Kafka 中的 Zookeeper。它的特点如下:

  • 每个 NameServer 节点相互独立,无信息交互;
  • NameServer 几乎是无状态的,通过部署多个节点来标识自己是一个伪集群。Producer 在发送消息时,会预先从 NameServer 得知自己要发送给的 Topic 的 Queue 位于哪个 Broker 上。Consumer 也会定时从 NameServer 获取 Topic 的 Queue 所在的 Broker 信息。Broker 在启动时,会将自己注册到 NameServer 当中,并通过心跳机制确保存活,定时维护 Topic 信息到 NameServer。
  • 「需要注意的是」:由于 NameServer 节点之间相互独立,因此 Broker 启动时以及心跳保活时,都需要将自己的状态发送给所有 NameServer 并行地进行注册。逻辑上来说,NameServer 集群当中的所有节点最终的状态是一致的。

Broker
Broker 扮演消息存储与中转的角色。具体来说,Broker 的职责如下:

  • 消息存储:持久化消息数据;
  • 消息路由:保存 Topic 与 Queue 的映射关系;
  • 服务提供:响应 Producer 的写入请求与 Consumer 的拉取请求;
  • 高可用保障:通过主从架构实现数据冗余。

在 Broker 当中,真正存储消息的是 CommitLog,而 ConsumeGroup 存储消息的逻辑队列索引,它标记的是消息在 CommitLog 中的位置,按 Topic 和 Queue 进行分组。

单个 Broker 与所有 NameServer 保持长连接,定时将 Topic 信息同步到 NameServer。

Producer
Producer 是 RocketMQ 中负责发送消息的客户端组件,它是消息的源头,将业务系统产生的消息发送到 Broker 服务器。具体来说,Producer 有三种消息发送的模式,分别是:

  • 同步发送:等待 Broker 返回确认消息;
  • 异步发送:通过回调函数处理发送消息的结果;
  • 单项发送:不关心发送的结果。

Producer 会自动从 NameServer 获取 Topic 的路由信息,从而将 Message 发送到 Topic 所在的 Broker 服务器,因此 Producer 只需要知道 NameServer 的服务地址即可。

Consumer
Consumer 是 RocketMQ 中负责接收消息的客户端组件,它从 Broker 中根据 Topic 拉取消息交由业务线程处理,是消息队列的最终目的地。

Consumer 有两种主要的消费模式,分别是:

  • 拉取(Pull)模式:主动从 Broker 拉取感兴趣 Topic 的消息;
  • 推送(Push)模式:Broker 推送消息给消费者(底层仍然是消费者主动拉取);

学习 RocketMQ Day2:进阶(一)

在这里插入图片描述

如何保证消息的可用性/可靠性/不丢失呢?

消息的可靠性保障可以从:生产者、中间存储、消费者三方面入手。

生产者
在生产阶段,通过请求确认机制,来确保消息成功被存储

  • 同步发送时:注意处理响应结果与异常。消息成功发送才算成功,如果响应失败,则需要重试机制确保消息重新发送;
  • 异步发送时:需要在回调函数中处理发送失败的情况,同样通过重试机制来确保消息重新发送;
  • 如果发生响应超时,可以通过查询日志的 API 来查看消息是否成功存储到 Broker,如果失败仍然需要重试。

中间存储
存储阶段,可以通过配置可靠性优先的 Broker 来避免因故障宕机而造成的消息丢失:

  • 消息只要持久化到了 CommitLog,即使 Broker 宕机,未经消费的消息也不会丢失;
  • Broker 的刷盘机制:同步刷盘与异步刷盘。显然同步刷盘更可靠。
  • Broker 通过主从模式确保高可用;

消费者
在消费者保障消息可靠意味着需要消费者成功将消息消费。关键在于消费者在客户端确认消息成功消费的时机,不应该在消息刚刚收到就确认消费,而应该在业务执行完毕时才确认消费。这样可以确保业务执行失败时可以重新消费消息。

如何处理消息重复的问题呢?

RocketMQ 可以确保消息一定投递且不丢失,即有消息可靠性保障,但是 RocketMQ 不能确保消息不被重复消费。

避免重复消费的两个手段是确保在业务端做好幂等性处理,或是进行消息去重。

幂等性指的就是多次相同的操作不会对系统产生副作用,显然读操作一定具备幂等性,难点在于如何确保写操作具有幂等性,比如库存系统如果收到重复的扣减库存消息,如何避免库存被重复扣减?

一个可选的确保幂等性的方式是,通过 MySQL 记录一张表,比如对于电商系统,新建一个订单表并使用唯一的 ID 对订单进行标识,这个表应该具有一个订单状态,如果订单的状态是已支付,那么重复到来的消息就不应该再一次扣减库存了。当然也可以在 Redis 缓存中设置标志位来达到类似的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索智能体开发新边界:Cangjie Magic开源平台体验与解析

文章目录 每日一句正能量前言一、Cangjie Magic的核心技术(一)Agent DSL架构(二)原生支持MCP通信协议(三)智能规划功能 二、实际应用场景(一)智能客服系统(二&#xff09…

深入解析进程间通信与Socket原理:从理论到TypeScript实战

文章目录 一、进程中如何通信1.1 管道1.1.1 核心特性1.1.2 缺点1.1.3 匿名管道与命名管道的对比 1.2 信号1.2.1 核心特性1.2.2 缺点1.2.3 信号分类对比 1.3 消息队列1.3.1 核心特性1.3.2 缺点 1.4 共享内存1.4.1 核心特性1.4.2 缺点 1.5 信号量1.5.1 核心特性1.5.2 缺点 二、So…

力扣-hot100(旋转图像)

48. 旋转图像 中等 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4…

Docker编排工具---Compose的概述及使用

目录 一、Compose工具的概述 二、Compose的常用命令 1、列出容器 2、查看访问日志 3、输出绑定的公共端口 4、重新构建服务 5、启动服务 6、停止服务 7、删除已停止服务的容器 8、创建和启动容器 9、在运行的容器中执行命令 10、指定一个服务启动容器的个数 11、其…

C25-数组应用及练习

第一题 题目: 代码 #include <stdio.h> int main() {//数组及相关数据定义int arr[10];int i;//基于循环的数组数据输入for(i0;i<10;i){arr[i]i;}//基于循环的数组数据输出for(i9;i>0;i--){printf("%d ",arr[i]);}return 0; }结果 第二题 题目 代码 …

网络安全怎么入门?快速了解

网络安全是一个快速发展的领域&#xff0c;入门需要系统化的学习和实践。以下是适合零基础或转行者的分阶段学习路径&#xff0c;涵盖必备知识、学习资源、实战方法和职业方向&#xff1a; 一、基础阶段&#xff08;1-3个月&#xff09; 1. 掌握核心基础知识 计算机网络&#…

express 怎么搭建 WebSocket 服务器

一&#xff1a;使用 express-ws var express require(express); var app express(); var expressWs require(express-ws)(app);app.use(function (req, res, next) {console.log(middleware);req.testing testing;return next(); });app.get(/, function(req, res, next){…

【AI论文】SuperEdit:修正并促进基于指令的图像编辑的监督信号

摘要&#xff1a;由于手动收集准确的编辑数据存在挑战&#xff0c;现有的数据集通常使用各种自动化方法构建&#xff0c;导致编辑指令和原始编辑图像对之间不匹配导致监督信号出现噪声。 最近的研究试图通过生成更高质量的编辑图像、在识别任务上进行预训练或引入视觉语言模型&…

关于大疆红外图片提取温度方法 python 方法

思路 红外图片需要是黑白图片 提取红外图片最高和最低温度 温度图例 根据最高温度31.2摄氏度 最低温度19.9摄氏度 那中间的值在 0到255 之间 那有这个值之后。就可以获取到图片里面 每个点或者面的值 实现方式 def find_Gray(self, t_max, t_min, c_temp):"""…

金融小知识

&#x1f4c9; 一、“做空”是啥&#xff1f; 通俗说法&#xff1a;押“它会跌”&#xff0c;赚钱&#xff01; ✅ 举个例子&#xff1a; 有一天老王的包子涨价到 10 块一个&#xff0c;张三觉得这价格肯定撑不住&#xff0c;未来会跌到 5 块。于是他&#xff1a; 向朋友借了…

JavaScript 数据存储全攻略:从 Cookie 到 IndexedDB

1. Cookie&#xff1a;传统的轻量级存储 Cookie 是最早的客户端存储解决方案之一&#xff0c;最初设计用于服务器和客户端之间的状态保持。 基本用法 javascript 复制 下载 // 设置cookie document.cookie "usernameJohnDoe; expiresThu, 18 Dec 2025 12:00:00 UTC…

Leetcode 刷题记录 09 —— 链表第三弹

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答&#xff0c;01~07为C语言&#xff0c;08及以后为Java语言。 01 合并 K 个升序链表 /*** Definitio…

如何利用 Elastic Load Balancing 提升应用性能与可用性?

当今云计算的快速发展中&#xff0c;随着应用需求的增加&#xff0c;如何确保系统能够高效、稳定地处理不断增长的流量成为了每个技术团队关注的焦点。Elastic Load Balancing&#xff08;ELB&#xff09;作为一种强大的工具&#xff0c;能够帮助开发者和运维人员轻松应对流量波…

Word如何制作三线表格

1.需求 将像这样的表格整理成论文中需要的三线表格。 2.直观流程 选中表格 --> 表格属性中的边框与底纹B --> 在设置中选择无&#xff08;重置表格&#xff09;–> 确定 --> 选择第一行&#xff08;其实是将第一行看成独立表格了&#xff0c;为了设置中线&…

JVM的双亲委派模型

引言 Java类加载机制中的双亲委派模型通过层层委托保证了核心类加载器与应用类加载器之间的职责分离和加载安全性&#xff0c;但其单向的委托关系也带来了一些局限性。尤其是在核心类库需要访问或实例化由应用类加载器加载的类时&#xff0c;双亲委派模型无法满足需求&#xf…

6.4.高并发设计

目录 一、高并发系统设计基础理论 CAP定理与高可用性权衡 • 一致性&#xff08;C&#xff09; vs 可用性&#xff08;A&#xff09;在电商、社交场景的取舍 • 分区容错性&#xff08;P&#xff09;的实践意义&#xff1a;异地多活与脑裂处理 性能指标与评估模型 • QPS、TP…

工程师转型算法工程师 深入浅出理解transformer-手搓板

编码器 以下部分引用台湾大学李宏毅教授的ppt 自己理解解释一遍(在youtobe 上可以搜索李宏毅即可) 首先先来看transformer的架构图 Embedding 我们先从Imput Embedding 跟 OutPutEmbedding 开始&#xff0c;让我们用 bert 模型来做一个解释 从huggingface上下载的bert-base…

软件工程学概述

一、软件危机 &#xff08;一&#xff09;软件危机的介绍 1. 基本思想与定义 软件危机&#xff08;Software Crisis&#xff09;是指在计算机软件的开发和维护过程中所遇到的一系列严重问题&#xff0c;这些问题既包括技术层面的挑战&#xff0c;也涉及管理层面的困境。其核心…

【ArcGIS Pro微课1000例】0068:Pro原来可以制作演示文稿(PPT)

文章目录 一、新建演示文稿二、插入页面1. 插入地图2. 插入空白文档3. 插入图像4. 插入视频三、播放与保存一、新建演示文稿 打开软件,新建一个地图文档,再点击【新建演示文稿】: 创建的演示文档会默认保存在目录中的演示文稿文件夹下。 然后可以对文档进行简单的设计,例如…

[吾爱出品][Windows] 产品销售管理系统2.0

[Windows] 产品销售管理系统 链接&#xff1a;https://pan.xunlei.com/s/VOPej1bHMRCHy2np9w3TBOyKA1?pwdgjy7# 使用方法&#xff1a;1、先设置一下图片保存路径 2、维护产品。客户等基础信息。例如&#xff1a;销售类型&#xff1a;一次性 销售编码&#xff1a;RCX。 3、销…