当前位置: 首页 > article >正文

RabbitMQ 在解决数据库高并发问题中的定位和核心机制

RabbitMQ 在解决数据库高并发问题中的定位和核心机制

它是间接但极其有效的解决方案,以下内容聚焦如何最大化发挥 RabbitMQ 的潜力:


一、核心机制落地强化方案

1. 精准的异步化切割

关键原则:区分 “必须同步”“可异步” 操作

核心业务校验
写库/日志/通知
用户请求
操作类型
同步处理
投递MQ
立即响应
  • 同步层:身份验证、基础参数校验、库存预扣(Redis)
  • 异步层:订单创建、支付回调、物流通知、行为分析
2. 动态流量削峰策略
流量状态队列策略消费者策略
正常流量内存队列固定消费者池
小高峰持久化磁盘增加20%消费者
大洪峰多队列分流K8s自动扩容+限流

二、消费者端关键代码优化

1. 精准的Prefetch调优公式
// 计算最优prefetchCount
int maxDbConnections = 50; // 数据库连接池大小
int consumerCount = 10;    // 单节点消费者数
int optimalPrefetch = maxDbConnections / consumerCount; @Bean
public SimpleRabbitListenerContainerFactory containerFactory() {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setPrefetchCount(optimalPrefetch); // 本例=5return factory;
}
2. 批量消费+事务提交
@RabbitListener(queues = "order.queue")
public void processBatch(List<Order> orders) {jdbcTemplate.batchUpdate("INSERT INTO orders(id,amount) VALUES(?,?)",new BatchPreparedStatementSetter() {public void setValues(PreparedStatement ps, int i) {ps.setString(1, orders.get(i).getId());ps.setBigDecimal(2, orders.get(i).getAmount());}public int getBatchSize() {return orders.size();}});// 单批次事务提交transactionTemplate.execute(status -> {return null;});
}

性能对比

写入方式TPS数据库CPU
单条提交1,20090%
批次提交(50条)8,50045%

三、高可靠架构设计

1. 全链路持久化
// 生产者端
rabbitTemplate.setChannelTransacted(true); // 开启事务
rabbitTemplate.execute(channel -> {channel.queueDeclare("orders", true, false, false, null); // 持久化队列AMQP.BasicProperties props = MessageProperties.PERSISTENT_TEXT_PLAIN; // 持久化消息channel.basicPublish("", "orders", props, message.getBytes());return null;
});// 消费者端
@RabbitListener(queues = "orders", ackMode = "MANUAL")
public void handle(Order order, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {try {saveToDB(order);channel.basicAck(tag, false); // 手动ACK} catch (Exception e) {channel.basicNack(tag, false, true); // 重试}
}
2. 多级死信处理
处理失败
自动重试3次
主队列
一级死信队列
二级死信队列
人工干预接口
报警通知

四、数据库层适配优化

1. 批量写入优化
/* MySQL 参数调优 */
SET GLOBAL innodb_flush_log_at_trx_commit = 2; 
SET GLOBAL sync_binlog = 0;
SET GLOBAL max_allowed_packet = 256M;
2. 消费者分库策略
// 根据订单ID分库
@RabbitHandler
public void process(Order order) {String dbKey = "order_db_" + (order.getId() % 4); // 分4库DataSource targetDs = dataSourceMap.get(dbKey);JdbcTemplate jdbcTemplate = new JdbcTemplate(targetDs);jdbcTemplate.update("INSERT INTO orders ...");
}

五、监控体系关键指标

RabbitMQ监控看板
指标预警阈值应对措施
Messages Ready>10,000扩容消费者
Unacked Messages>5,000检查消费者是否阻塞
Publish Rate>5,000/s评估是否需队列拆分
Disk Free Space<30%清理旧队列或扩容磁盘
数据库监控看板
指标预警阈值应对措施
Threads_running>100降低消费者并发度
InnoDB_buffer_wait>1%增加innodb_buffer_pool_size
Replication Lag>10s暂停部分消费者

六、特殊场景解决方案

1. 秒杀场景:令牌桶+预扣减
User API Redis RabbitMQ 秒杀请求 获取令牌(bucket.tryAcquire) 发送创建订单消息 ACK 成功 已售罄 alt [获取成功] [获取失败] User API Redis RabbitMQ
2. 资金交易:最终一致性补偿
// 使用本地事务表
@Transactional
public void processPayment(Order order) {// 1. 记录本地事务txLogDao.insert(order.getId(), "PAYMENT_PROCESSING");// 2. 发送MQrabbitTemplate.convertAndSend("payment.exchange", order);
}// 消费者
@RabbitListener(queues = "payment.queue")
public void finishPayment(Order order) {paymentService.execute(order);txLogDao.updateStatus(order.getId(), "SUCCESS"); 
}// 补偿Job
@Scheduled(fixedRate = 300000)
public void checkTimeoutPayments() {List<String> timeoutIds = txLogDao.findTimeoutRecords();timeoutIds.forEach(id -> {// 触发退款或人工处理});
}

总结:RabbitMQ 缓解数据库高并发的 “三横四纵”架构

三横(分层):接入层 → 异步化请求接收缓冲层 → RabbitMQ流量整形执行层 → 可控数据库写入四纵(关键能力):▫ 弹性伸缩:基于队列长度动态扩缩消费者▫ 可靠性:持久化+ACK+死信+幂等▫ 数据治理:批量处理+分库策略▫ 实时监控:队列堆积与数据库健康联动告警

通过以上设计,可使数据库承受的 QPS 从 2000 提升至 20000+,同时保证 99.95% 的请求在 500ms 内响应。关键在于:不是简单加队列,而是构建可控的异步生态系统

注意

RabbitMQ 本身不直接处理数据库的高并发问题,但它是一个强大的消息队列中间件,可以通过解耦、异步化和流量削峰的方式,显著缓解数据库在高并发场景下的压力,从而提高整个系统的吞吐量和稳定性。

以下是 RabbitMQ 如何帮助解决数据库高并发挑战的核心机制:

  1. 异步化处理(核心机制):

    • 问题: 在高并发下,大量用户/服务直接同步访问数据库(如插入订单、更新库存)。每个请求都需要数据库立即处理、返回结果,导致数据库连接池耗尽、CPU/IO饱和、响应延迟飙升。
    • RabbitMQ 方案: 应用程序(生产者)不直接操作数据库。它将需要数据库处理的任务(例如“创建订单”、“扣减库存”、“记录日志”)封装成消息,发送到 RabbitMQ 队列。
    • 效果: 用户请求(生产者)快速响应(只需确认消息发送成功),无需等待数据库操作完成。数据库的压力被转移到了消息队列的写入上(RabbitMQ 处理队列写入非常高效)。数据库操作由专门的消费者程序(可能是多个)异步地从队列中取出消息并执行。
  2. 流量削峰填谷:

    • 问题: 流量高峰(如秒杀、促销)瞬间产生远超数据库处理能力的请求,导致数据库崩溃或严重超时。
    • RabbitMQ 方案: RabbitMQ 作为一个高性能的缓冲区,可以积压大量的消息。高峰期的请求被平滑地存储在队列中。
    • 效果: 数据库消费者可以按照自身可控的速度(例如,根据数据库负载动态调整消费者数量或消费速率)从队列中拉取消息进行处理。高峰期积压的消息可以在流量低谷时被慢慢消化掉。避免了数据库被瞬间洪峰冲垮。
  3. 解耦:

    • 问题: 服务直接耦合数据库,数据库的抖动或维护直接影响前端服务和用户体验。扩展数据库(如分库分表、读写分离)通常更复杂、成本更高。
    • RabbitMQ 方案: 生产者和消费者通过 RabbitMQ 通信,彼此不直接依赖。生产者只需要知道队列地址,消费者只需要知道如何处理消息。数据库成为消费者后端的资源。
    • 效果:
      • 数据库透明性: 数据库的变更(如迁移、扩容、维护)对生产者几乎无影响(只要消费者适配好)。生产者只关心消息是否入队成功。
      • 独立伸缩: 可以根据业务流量独立扩展生产者、RabbitMQ集群、消费者集群、数据库。例如,可以轻松增加消费者实例数量来提升数据库操作的处理能力,而无需改动生产者或数据库结构(在合理范围内)。
      • 容错性增强: 如果数据库短暂不可用,消息会安全地存储在 RabbitMQ 队列中(需要持久化设置),等数据库恢复后消费者继续处理。不会丢失请求(在合理配置下)。
  4. 并行处理能力:

    • 问题: 单线程或少量连接处理数据库请求效率低下。
    • RabbitMQ 方案: 可以启动多个消费者实例,或者在一个消费者内使用多线程,从同一个队列中并行地拉取消息并执行数据库操作。
    • 效果: 极大地提高了数据库操作的并发处理能力,充分利用数据库资源(连接池、CPU),缩短任务整体处理时间。

典型应用场景流程:

  1. 用户请求: 用户发起一个需要写数据库的操作(如提交订单)。
  2. 生产者(应用服务):
    • 验证请求合法性。
    • 构造任务消息(包含订单数据)。
    • 将消息发送到指定的 RabbitMQ 队列(例如 order.create.queue)。发送成功后即可返回响应给用户(如“订单提交成功,正在处理中”)。
  3. RabbitMQ: 接收并持久化(如果需要)存储消息。
  4. 消费者(专门的服务):
    • 监听 order.create.queue 队列。
    • 从队列获取消息。
    • 执行实际的数据库操作(如向 orders 表插入记录、扣减库存)。
    • 处理成功则向 RabbitMQ 发送确认 (ack)。
    • 处理失败可选择重试(N次)或放入死信队列 (DLX) 进行人工/特殊处理。
  5. 数据库: 按消费者可控的节奏处理请求,避免过载。

使用 RabbitMQ 时需要注意的关键点:

  1. 消息可靠性:
    • 生产者确认 (Publisher Confirms): 确保消息成功到达 RabbitMQ Broker。
    • 消息持久化: 将消息和队列标记为持久化 (durable=true),防止 Broker 重启导致消息丢失(不能100%保证,但大大降低风险)。
    • 消费者确认 (Manual Acknowledgements): 消费者处理成功后再 ack,处理失败或崩溃时消息会重新入队(给其他消费者)或进入死信队列。避免使用自动 ack(消息发出即删除)。
  2. 消费者端的限流 (QoS/Prefetch Count): 设置消费者一次最多能预取多少条未确认的消息 (prefetch count)。这是控制数据库压力的最关键阀门!必须根据数据库的实际处理能力仔细设置。例如,设置 prefetch_count=1 表示消费者处理完一条并 ack 后,才会从队列获取下一条。这能有效防止消费者压垮数据库。
  3. 消费者并发度: 根据数据库负载和消费者处理能力,动态调整消费者实例的数量。太多消费者可能压垮数据库,太少则处理不过来。
  4. 幂等性: 由于网络问题或消费者故障可能导致消息被重复投递(redelivered=true),消费者处理逻辑必须保证幂等(多次执行同一消息产生的结果与执行一次相同)。例如,使用唯一业务ID(如订单号)来避免重复插入或更新。
  5. 死信队列 (DLX): 处理那些因各种原因(重试多次仍失败、消息过期、队列满)无法被正常消费的消息,方便排查问题和手动处理。
  6. 监控与告警: 密切监控 RabbitMQ 的队列长度、消费者状态、消息堆积情况、未确认消息数以及数据库的关键指标(连接数、CPU、IO、慢查询)。设置告警阈值。

总结:

RabbitMQ 不是数据库高并发的“银弹”,但它是一个极其有效的缓冲层和异步化工具。通过将瞬时的、高并发的同步数据库写操作,转化为异步的、可控的队列消费操作,RabbitMQ 能够:

  • 保护数据库: 避免数据库被流量洪峰直接冲击而崩溃。
  • 提高系统吞吐量: 允许前端快速响应,后端平稳处理。
  • 增强系统弹性: 应对流量波动,支持组件独立伸缩。
  • 提升用户体验: 用户操作得到快速响应(即使后台处理需要时间)。

连接数、CPU、IO、慢查询)。设置告警阈值。

总结:

RabbitMQ 不是数据库高并发的“银弹”,但它是一个极其有效的缓冲层和异步化工具。通过将瞬时的、高并发的同步数据库写操作,转化为异步的、可控的队列消费操作,RabbitMQ 能够:

  • 保护数据库: 避免数据库被流量洪峰直接冲击而崩溃。
  • 提高系统吞吐量: 允许前端快速响应,后端平稳处理。
  • 增强系统弹性: 应对流量波动,支持组件独立伸缩。
  • 提升用户体验: 用户操作得到快速响应(即使后台处理需要时间)。

要成功运用 RabbitMQ 解决数据库高并发问题,关键在于合理的架构设计(明确哪些操作适合异步)、可靠的配置(消息持久化、确认机制)以及对消费者端流量的精准控制(QoS、消费者数量)。

相关文章:

RabbitMQ 在解决数据库高并发问题中的定位和核心机制

RabbitMQ 在解决数据库高并发问题中的定位和核心机制 它是间接但极其有效的解决方案&#xff0c;以下内容聚焦如何最大化发挥 RabbitMQ 的潜力&#xff1a; 一、核心机制落地强化方案 1. 精准的异步化切割 关键原则&#xff1a;区分 “必须同步” 和 “可异步” 操作 #merma…...

VSCode主题定制:CSS个性化你的编程世界

在今天的数字世界&#xff0c;编程环境已成为开发者的第二大脑&#xff0c;而主题正是个性化你的创意空间的关键。本文将指导你如何使用CSS自定义VSCode的主题&#xff0c;让你的IDE不仅功能强大&#xff0c;更具视觉个性。 思路分析 设计思路&#xff1a; 创建主色调基调和…...

Windows 下彻底删除 VsCode

彻底删除 VS Code (Visual Studio Code) 意味着不仅要卸载应用程序本身&#xff0c;还要删除所有相关的配置文件、用户数据、插件和缓存。这可以确保你有一个完全干净的状态&#xff0c;方便你重新安装或只是彻底移除它。 重要提示&#xff1a; 在执行以下操作之前&#xff0c…...

一文带你入门Java Stream流,太强了,mysqldba面试题及答案

list.add(“世界加油”); list.add(“世界加油”); long count list.stream().distinct().count(); System.out.println(count); distinct() 方法是一个中间操作&#xff08;去重&#xff09;&#xff0c;它会返回一个新的流&#xff08;没有共同元素&#xff09;。 Stre…...

FastAPI安全异常处理:从401到422的奇妙冒险

title: FastAPI安全异常处理:从401到422的奇妙冒险 date: 2025/06/05 21:06:31 updated: 2025/06/05 21:06:31 author: cmdragon excerpt: FastAPI安全异常处理核心原理与实践包括认证失败的标准HTTP响应规范、令牌异常的特殊场景处理以及完整示例代码。HTTP状态码选择原则…...

阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库

阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库 最近帮朋友 完成一些运维工作 &#xff0c;这里记录一下。 文章目录 阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库最近帮朋友 完成一些运维工作 &#xff0c;这里记录一下。 阿里云 RDS MySQL 5.7 添加白名单1. 登录…...

《Brief Bioinform》: 鼠脑单细胞与Stereo-seq数据整合算法评估

一、写在前面 基因捕获效率、分辨率一直是空间转录组细胞类型识别的拦路虎&#xff0c;许多算法能够整合单细胞(single-cell, sc)或单细胞核(single-nuclear, sn)数据与空间转录组数据&#xff0c;从而帮助空转数据的细胞类型注释。此前我们介绍过近年新出炉的Stereo-seq平台&…...

基于Springboot的宠物领养系统

本系统是一个面向社会的宠物领养平台&#xff0c;旨在帮助流浪宠物找到新家庭&#xff0c;方便用户在线浏览、申请领养宠物&#xff0c;并支持管理员高效管理宠物、公告和用户信息。 技术栈&#xff1a; -后端&#xff1a; Java 8Spring BootSpring MVCMyBatis-PlusMySQL 8R…...

AI API、AI 聊天助手,两大服务助力应用智能化转型

网络效应、转换成本——这些一度定义了我们这个时代商业逻辑的规则&#xff0c;在 AI 时代迅速崩塌。创新性功能被无差别克隆包围&#xff0c;差异化优势在底层能力翻新中消散…… 更别说那些决策迟缓、行动无法言出法随的“后来者”&#xff0c;注定与市场窗口擦身而过。唯快…...

Windows 下搭建 Zephyr 开发环境

1. 系统要求 操作系统&#xff1a;Windows 10/11&#xff08;64位&#xff09;磁盘空间&#xff1a;至少 8GB 可用空间&#xff08;Zephyr 及其工具链较大&#xff09;权限&#xff1a;管理员权限&#xff08;部分工具需要&#xff09; 2. 安装必要工具 winget安装依赖工具&am…...

蓝桥杯单片机之通过实现同一个按键的短按与长按功能

实现按键的短按与长按的不同功能 问题分析 对于按键短按&#xff0c;通常是松开后实现其功能&#xff0c;而不会出现按下就进行后续的操作&#xff1b;而对于按键长按&#xff0c;则不太一样&#xff0c;按键长按可能分为两种情况&#xff0c;一是长按n秒后实现后续功能&…...

如何用 pnpm patch 给 element-plus 打补丁修复线上 bug(以 2.4.4 修复 PR#15197 为例)

背景 在实际项目开发中&#xff0c;依赖的三方库&#xff08;如 element-plus&#xff09;难免会遇到 bug。有时候官方虽然已经修复&#xff0c;但新版本升级成本高&#xff0c;或者有兼容性风险。这时&#xff0c;给依赖打补丁是最优雅的解决方案之一。 本文以 element-plus…...

PCB特种工艺应用扩展:厚铜、高频与软硬结合板

新能源汽车与消费电子驱动PCB特种工艺创新&#xff0c;厚铜板降阻30%&#xff0c;软硬结合板渗透率年增15%。 1. 厚铜板&#xff1a;新能源高压平台核心 技术突破&#xff1a;猎板PCB量产10oz厚铜板&#xff08;传统为3oz&#xff09;&#xff0c;载流能力提升200%&#xff0c…...

ClusterRole 和 ClusterRoleBinding 的关系及使用

ClusterRole 和 ClusterRoleBinding 是 Kubernetes 中用于控制集群范围权限的两个重要资源&#xff0c;它们共同构成了 Kubernetes RBAC (基于角色的访问控制) 系统的核心部分。 两者的关系 ClusterRole 定义了一组权限规则&#xff0c;指定了可以对哪些资源执行哪些操作 Clu…...

C++ const 修饰符深入浅出详解

C const 修饰符深入浅出详解 &#x1f4c5; 更新时间&#xff1a;2025年6月6日 &#x1f3f7;️ 标签&#xff1a;C | const关键字 | 常量 | 多文件编程 | 现代C 文章目录 前言&#x1f31f; 一、const 是什么&#xff1f;为什么要用&#xff1f;示例✅ const 的四大好处 &…...

Python 数据类型转换、编码处理与文件操作实战指南

一、数据类型转换 int (整型) 与 str (字符串) 之间&#xff1a; str 转 int&#xff1a;int("123") (要求字符串内容必须是数字)。 int 转 str&#xff1a;str(123)。 规则&#xff1a; 使用目标类型的英文名加括号包裹原数据即可。 list (列表) 与 tuple (元组…...

Readest(电子书阅读器) v0.9.53

Readest 是一款开源电子书阅读器&#xff0c;专为沉浸式和深度阅读体验而设计。它是对Foliate的现代重写&#xff0c;利用Next. js 15和Tauri v2在macOS、Windows、Linux和Web上提供无缝的跨平台体验&#xff0c;并即将支持移动平台。 软件特色 多格式支持 支持EPUB、MOBI、K…...

USART 串口通信全解析:原理、结构与代码实战

文章目录 USARTUSART简介USART框图USART基本结构数据帧起始位侦测数据采样波特率发生器串口发送数据 主要代码串口接收数据与发送数据主要代码 USART USART简介 一、USART 的全称与基本定义 英文全称 USART&#xff1a;Universal Synchronous Asynchronous Receiver Transmi…...

Matlab | matlab中的图像处理详解

MATLAB 图像处理详解 这里写目录标题图像处理 MATLAB 图像处理详解一、图像基础操作1. 图像读写与显示2. 图像信息获取3. 图像类型转换二、图像增强技术1. 对比度调整2. 去噪处理3. 锐化处理三、图像变换1. 几何变换2. 频域变换四、图像分割1. 阈值分割2. 边缘检测3. 区域分割五…...

UOS无法安装deb软件包

UOS无法安装deb软件包 问题描述解决办法: 关闭安全中心的应用隔离结果验证 问题描述 UOS安装Linux微信的deb包时&#xff0c;无法正常安装 解决办法: 关闭安全中心的应用隔离 要关闭-安全中心的应用隔离后才可以正常软件和运行。 应用安全----》 允许任意应用。 结果验证 # …...

VUE前端实现自动打包成压缩文件

VUE前端实现自动打包成压缩文件 背景思路实现打包代码实现 尾巴 背景 做前端开发的兄弟们都经历过每次开发完成之后发包需要进行打包&#xff0c;然后将打包文件压缩。每次打好包了都得手动压缩一遍&#xff0c;就有点繁琐。今天我们就使用一种命令行自动压缩的方法&#xff0…...

2025政务服务便民热线创新发展会议顺利召开,张晨博士受邀分享

5月28日&#xff0c;由新华社中国经济信息社、新华社广东分社联合主办的2025政务服务便民热线创新发展暨“人工智能热线”会议在广州举行。会议围绕“人工智能与新质热线”主题&#xff0c;邀请全国的12345政务服务便民热线主管部门负责人、省市热线负责人和专家学者&#xff0…...

【PDF PicKiller】PDF批量删除固定位置图片工具,默认解密,可去一般图、背景图、水印图!

PDF批量删除固定位置图片工具 PDF PicKiller <center>PDF PicKiller [Download](https://github.com/Peaceful-World-X/PDF-PicKiller)&#x1f929; 工具介绍&#x1f973; 主要功能&#x1f92a; 软件使用&#x1f92a; 参数解释&#x1f92a; 关键代码&#x1f929; 项…...

SpringAI Alibaba实战文生图

1️⃣ 前置准备&#xff1a;搭建开发环境与服务配置&#x1f680; &#x1f527; 1.1 环境要求 JDK 17&#xff08;推荐 JDK 21&#xff09;、Spring Boot 3.x&#xff08;本案例使用 3.3.4&#xff09;、阿里云百炼大模型服务 API Key。需在阿里云控制台完成服务开通并获取有…...

GIC700组件

GIC700包含了几个重要的组件,它们使用一个内部的GIC互联,用于在不同的组件之间使用AXI5-Stream接口进行路由。 1. Distributor(GICD) gicd是GIC700中所有组件之间的主要通信节点。它作为SPI的管理者以及维护LPI的cache,并且与其它chip上的GIC700组件进行通信。当支持GIC…...

几种简单的排序算法(C语言)

目录 1 简介 2 冒泡排序 2.1 基本思路 2.2 代码实现 3 选择排序 3.1 基本思路 3.2 代码实现 4 插入排序 4.1 基本思路 4.2 代码实现 5 快速排序 5.1 基本思路 5.2 代码实现 6 归并排序 6.1 基本思路 6.2 代码实现 7 基数排序 7.1 基本思路 7.2 代码实现 8 …...

RTOS学习之重难点

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

有没有 MariaDB 5.5.56 对应 MySQL CONNECTION_CONTROL 插件

有没有 MariaDB 对应 MySQL CONNECTION_CONTROL 插件 背景 写这篇文章的目的是因为昨晚半夜突然被call起来&#xff0c;有一套系统的mysql数据库启动失败了。尝试了重启服务器也不行。让我协助排查一下问题出在哪。 分析过程 一开始拿到服务器IP地址&#xff0c;就去数据库…...

setting up Activiti BPMN Workflow Engine with Spring Boot

spring.activiti.database-schema-update: true Controls how Activiti handles its database tables on startup. Options: true – Default. Creates or updates tables automatically if missing. ✅ Good for development. false – Disables auto-update. Throws an err…...

使用 C/C++ 和 OpenCV 提取图像的感兴趣区域 (ROI)

使用 C/C 和 OpenCV 提取图像的感兴趣区域 (ROI) 在计算机视觉中&#xff0c;感兴趣区域 (Region of Interest, ROI) 是指从图像中选择的一个特定区域&#xff0c;我们希望对其进行进一步的处理或分析。例如&#xff0c;在人脸识别中&#xff0c;ROI 就是包含人脸的矩形框。Op…...