RocketMQ实战:异步处理长耗时API调用

RocketMQ请求超时的排查处理过程 从日志分析、源码分析、抓包处理、报文分析、堆栈分析等角度分享一次RocketMQ请求响应慢的排查处理过程。 阅读详情


大家好,在现在的ai项目中,我们经常涉及大量的长耗时操作,比如在ai音视频处理项目中,我们就要调用asr语音转文字API和大模型API生成视频总结,如果让前端同步等待20-30秒,用户早已关闭页面。
为了实现“上传即返回,后台稳如狗”的体验,我们可以引入RocketMQ。

一、 异步任务场景

假设现有一个音视频智能分析平台,核心功能是:

场景说明耗时
视频音频提取基于 FFmpeg 从上传视频中分离提取音频流30-60 秒
语音 ASR 转写将音频完整转写为文本2-5 分钟
AI 智能总结调用大模型对转写文本进行智能总结6-20 秒
知识库构建对总结文本进行向量化处理,并存储至向量数据库中8-35 秒

用户感知到的流程:上传 → 等待几分钟 → 看到 AI 总结和测验题目。

实际的系统链路:

用户上传视频
    │
    ▼
[HTTP 接口] ──► 保存文件到 MinIO(1秒)
    │
    ▼
[发送 MQ] ──► 立即返回:"处理中,请稍候"
    │
    ▼
[RocketMQ Broker]
    │
    ├──► [消费者 1] FFmpeg 提取音频(30-60秒)
    │
    ├──► [消费者 2] ASR 语音转写(2-5分钟)
    │
    ├──► [消费者 3] AI 分析总结(1-3分钟)
    │
    └──► [消费者 4] 知识库向量化(30秒)

关键挑战:整个处理链路耗时 3-10 分钟,涉及 4 个耗时环节、3 个外部 AI 服务。


二、不用 RocketMQ 的"噩梦架构"

假设我们不用消息队列,直接同步处理:

// 伪代码:同步处理版本(灾难版)
@PostMapping("/upload")
public Result upload(MultipartFile file) {
    // 1. 保存文件
    MediaEntity media = saveFile(file);
    
    // 2. 提取音频(阻塞 30-60 秒)
    String audioPath = ffmpegService.extractAudio(media);
    
    // 3. 语音转写(阻塞 2-5 分钟)
    String transcript = asrService.transcribe(audioPath);
    
    // 4. AI 分析(阻塞 1-3 分钟)
    AnalysisResult result = aiService.analyze(transcript);
    
    // 5. 保存结果
    saveAnalysisResult(media, result);
    
    return Result.success(result); // 用户等了 5-8 分钟!
}

2.1 同步架构的四大致命问题

问题现象后果
HTTP 超时Nginx/网关默认 60s 超时大文件处理直接报错
资源耗尽10 人同时上传,10 个 FFmpeg 进程CPU 100%,系统卡死
级联失败AI 接口超时 → 整个请求失败用户需重新上传,体验极差
无法扩展新增"视频标签生成"功能必须修改上传接口,耦合严重

真实场景:一个 500MB 的视频,FFmpeg 提取音频要 1 分钟,ASR 转写要 2 分钟,AI 分析要 2 分钟。用户盯着浏览器等了 5 分钟,最后 AI 接口超时,一切重来。


三、引入 RocketMQ 后的架构蜕变

┌─────────────────────────────────────────────────────────────┐
│                     同步架构(无 MQ)                        │
│                                                             │
│   用户 ──► 上传 ──► [FFmpeg] ──► [ASR] ──► [AI] ──► 结果     │
│              ↑                              ↑               │
│              └──────────── 阻塞 5-10 分钟 ───┘               │
│                                                             │
│   问题:HTTP 超时、资源耗尽、级联失败、无法扩展                │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│                    异步架构(有 MQ)                         │
│                                                             │
│   用户 ──► 上传 ──► [保存文件] ──► 返回"处理中"(1 秒内)     │
│                              │                              │
│                              ▼                              │
│                        [RocketMQ]                           │
│                              │                              │
│              ┌───────────────┼───────────────┐              │
│              ▼               ▼               ▼              │
│         [消费者 1]      [消费者 2]      [消费者 3]           │
│         提取音频        语音转写        AI 分析              │
│         (1 分钟)        (3 分钟)        (2 分钟)             │
│                                                             │
│   优势:快速响应、削峰填谷、失败重试、独立扩展                 │
└─────────────────────────────────────────────────────────────┘

架构流程图:

已有任务执行中

获取成功

是

用户上传视频 / 链接

MediaUploadService

保存文件到 MinIO / S3

保存媒体记录到 DB

创建 MediaProcessTask
状态=PENDING

AnalyzeRocketMQProducer

RocketMQ
Topic: video-analysis-topic
Tag: analyze-task

AnalyzeRocketMQConsumer

获取 Redisson 分布式锁

忽略重复消费

更新任务状态
RUNNING / ANALYZING

MediaSummaryService

AI 转写

AI 摘要

生成章节 / 标签 / 内容分析

保存分析结果到 MediaAnalysis 表

更新 MediaFile.summaryStatus = SUCCESS

更新 MediaProcessTask = SUCCESS

通知前端 SSE 推送

前端刷新详情页

是否需要构建知识库?

VectorizeRocketMQProducer

RocketMQ
Topic: knowledgebase-vectorize-topic
Tag: vectorize

VectorizeRocketMQConsumer

KnowledgeIndexBuildService

切片 transcript / summary

向量化 Embedding

写入 Chroma / 知识库

更新 KnowledgeBase 状态 COMPLETED

用户发起答题

QuizSessionService 创建答题会话

QuizEvaluateRocketMQProducer

RocketMQ
Topic: quiz-evaluate-topic
Tag: evaluate

QuizEvaluateRocketMQConsumer

更新评估状态 PROCESSING

QuizEvaluationService

AI 批改答案

生成 QuizReport

更新 QuizSession 状态 EVALUATED / SUCCESS

前端查看测评结果

状态流转图:

创建任务 / 保存数据库记录

RocketMQ Consumer 开始消费

MQ 发送失败

用户取消任务

业务执行完成

调用 AI / ASR / 向量库失败

超过最大重试次数

人工终止任务

RocketMQ 重新投递

重试次数耗尽

某次重试成功

PENDING

PROCESSING

FAILED

CANCELED

SUCCESS

RETRYING

PENDING :任务已创建,等待消费
PROCESSING:后台正在执行 AI 处理
RETRYING:执行失败,系统自动重试
SUCCESS:处理完成,通知前端展示结果
FAILED:重试耗尽,任务失败
CANCELED:用户 / 人工取消,终止任务

四、RocketMQ 在项目中的四大核心价值

4.1 价值一:异步解耦,用户体验质变

实现方式:asyncSend 异步发送

// AbstractRocketMQProducer.java 核心代码
public void sendTask(T payload) {
    String mqDestination = getDestination(); // topic:tag
    
    // 异步发送:不阻塞主线程
    rocketMQTemplate.asyncSend(mqDestination, buildMessage(payload), new SendCallback() {
        @Override
        public void onSuccess(SendResult sendResult) {
            log.info("任务发送成功,消息ID:{}", sendResult.getMsgId());
        }
        @Override
        public void onException(Throwable e) {
            // 发送失败兜底:更新数据库状态为 FAILED
            onSendFailed(payload, truncateError(e.getMessage()));
        }
    });
}

关键设计:即使 MQ 发送失败,也有 onSendFailed 回调更新数据库状态,用户刷新页面能看到"处理失败",可手动重试。


4.2 价值二:削峰填谷,保护系统资源

场景:1000 个用户同时上传视频

流量特征:
- 上传请求瞬时峰值:1000 QPS(持续 10 秒)
- 实际处理能力:FFmpeg 最多 4 并发,ASR 接口限流 10 QPS

无 MQ 时:
1000 个请求 ──► 1000 个 FFmpeg 进程启动 ──► 系统 OOM 崩溃

有 MQ 时:
1000 个请求 ──► 快速入队(Broker 缓冲)──► 消费者按能力消费
                │
                └── 消费者线程池:core=2, max=4, queue=50
                └── FFmpeg 最多 4 个并发,系统稳定

线程池配置:

@Configuration
@EnableAsync
public class AsyncExecutorConfig {
    @Bean("mediaProcessExecutor")
    public Executor mediaProcessExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);      // 核心 2 线程
        executor.setMaxPoolSize(4);       // 最大 4 线程(保护 FFmpeg)
        executor.setQueueCapacity(50);    // 队列缓冲 50 任务
        executor.setThreadNamePrefix("media-process-");
        return executor;
    }
}

4.3 价值三:可靠投递,失败自动重试

三级可靠性保障:

层级机制实现
Broker 级消息持久化 + 主从复制RocketMQ 默认配置
发送级发送失败回调兜底onSendFailed 更新数据库
消费级业务失败重试 3 次抛异常触发 RocketMQ 重试

消费端重试代码:

@Slf4j
@Component
@RocketMQMessageListener(
    topic = "video-analysis-topic",
    selectorExpression = "analyze-task",
    consumerGroup = "media-analyze-consumer-group"
)
public class AnalyzeRocketMQConsumer implements RocketMQListener<Map<String, String>> {
    
    private static final int MAX_RETRY_COUNT = 3;
    
    @Override
    public void onMessage(Map<String, String> message) {
        int retryCount = parseRetryCount(message);
        AnalyzePayload payload = parsePayload(message);
        
        try {
            markProcessing(payload);        // 状态:PROCESSING
            long costMs = processBusiness(payload);  // 执行业务
            markCompleted(payload);          // 状态:SUCCESS
            
        } catch (Exception e) {
            if (retryCount < MAX_RETRY_COUNT) {
                // 抛异常 → RocketMQ 自动重试(间隔递增:1s, 5s, 10s)
                throw new RuntimeException("触发重试", e);
            } else {
                // 重试耗尽 → 标记失败,用户可手动重试
                markFailed(payload, "已重试" + retryCount + "次: " + e.getMessage());
            }
        }
    }
}

重试策略可视化:

第 1 次消费 ──► 失败 ──► 1 秒后重试
第 2 次消费 ──► 失败 ──► 5 秒后重试  
第 3 次消费 ──► 失败 ──► 10 秒后重试
第 4 次消费 ──► 失败 ──► 进入死信队列(DLQ)/ 标记 FAILED

4.4 价值四:独立扩展,功能自由叠加

当前消费者组:

业务TopicTagConsumer Group职责
媒体分析video-analysis-topicanalyze-taskmedia-analyze-consumer-group转写 + AI 总结
知识库构建knowledgebase-vectorize-topicvectorizeknowledgebase-vectorize-consumer-group向量化入库
测验评估quiz-evaluate-topicevaluatequiz-evaluate-consumer-groupAI 批改答案

扩展场景:新增"智能封面生成"功能

// 新增生产者(无需改上传接口)
@Component
public class CoverGenerateProducer extends AbstractRocketMQProducer<CoverPayload> {
    @Override protected String topic() { return "cover-generate-topic"; }
    @Override protected String tag() { return "generate"; }
}

// 新增消费者(独立部署,互不影响)
@RocketMQMessageListener(
    topic = "cover-generate-topic",
    selectorExpression = "generate",
    consumerGroup = "cover-generate-consumer-group"
)
public class CoverGenerateConsumer implements RocketMQListener<Map<String, String>> {
    // 调用 Stable Diffusion / DALL-E 生成封面
}

价值:上传接口完全不用改,新增功能独立开发、独立部署、独立扩缩容。


五、关键设计细节

5.1 问题一:异步重度依赖 MQ,消息积压、消费者消费不过来怎么监控和处理?

在 项目中,异步链路完全依赖 RocketMQ,一旦出现消息积压(消费者消费速度低于生产者发送速度),会导致用户任务处理延迟、超时,严重影响体验。核心解决思路是「监控先行,分层处理」,具体落地方案如下:

5.1.1 消息积压监控(提前预警,避免爆发)

基于 RocketMQ 自带监控能力 + 自定义告警,实现全链路监控,重点关注 3 个核心指标:

表格

监控指标说明阈值建议
队列堆积数每个 Topic 的每个 Queue 中未消费消息数消费者最大并发数 × 10(如 4 并发则设 40)
消费堆积时间最早未消费消息的存储时间30 分钟(超过则用户任务延迟明显)
消费速率消费者每秒消费消息数低于发送速率的 80% 时触发预警

实现方式:

  1. 利用 RocketMQ Console 可视化监控,实时查看队列堆积、消费速率等指标;

  2. 通过 RocketMQ 提供的 API 自定义监控采集,代码示例:

// 采集队列堆积数示例
@Autowired
private MQAdminExt mqAdminExt;

public void collectQueueBacklog() throws MQClientException {
    String topic = "video-analysis-topic";
    List<MessageQueue> queues = mqAdminExt.fetchMessageQueuesInTopic(topic);
    
    for (MessageQueue queue : queues) {
        // 获取队列最大偏移量(已发送消息数)
        long maxOffset = mqAdminExt.maxOffset(queue);
        // 获取队列已消费偏移量(已处理消息数)
        long consumeOffset = mqAdminExt.getConsumerOffset(
            queue.getTopic(), 
            queue.getConsumerGroup()
        );
        // 堆积数 = 最大偏移量 - 已消费偏移量
        long backlog = maxOffset - consumeOffset;
        
        // 触发告警(如钉钉、企业微信通知)
        if (backlog > 40) {
            alarmService.sendAlarm(
                "MQ消息积压告警", 
                "Topic:" + topic + ", Queue:" + queue.getQueueId() + ", 堆积数:" + backlog
            );
        }
    }
}

5.1.2 消息积压处理

根据积压程度,分 3 级 处理,避免小问题扩大为系统故障:

表格

级别积压范围处理策略
轻度积压堆积数 < 100扩容消费者并发数,动态调整线程池配置(无需重启服务)
中度积压100 ≤ 堆积数 < 1000部署临时消费者节点,新增相同 Consumer Group 的消费者分担压力
重度积压堆积数 ≥ 1000暂停非核心生产者,优先处理核心任务;同时优化消费逻辑

轻度积压处理代码示例:

// 动态调整消费者线程池(核心代码)
@Autowired
private ThreadPoolTaskExecutor mediaProcessExecutor;

public void scaleConsumerThreadPool(int coreSize, int maxSize) {
    mediaProcessExecutor.setCorePoolSize(coreSize);  // 动态增加核心线程
    mediaProcessExecutor.setMaxPoolSize(maxSize);    // 动态增加最大线程
}

说明: 中度积压时,RocketMQ 会自动负载均衡,将 Queue 分配给新增节点;重度积压时需优先保障核心链路(音频提取、ASR 转写)。


5.2 问题二:使用 RocketMQ 做业务解耦,视频上传多步骤是否需要顺序处理?如何实现 RocketMQ 消息顺序消费?

核心结论: 视频上传的多步骤(音频提取 → ASR 转写 → AI 总结 → 知识库构建)必须保证顺序处理,但无需全局顺序,只需保证「同一视频」的步骤顺序即可;不同视频的步骤可并行处理,兼顾顺序性和吞吐量。

5.2.1 为什么必须保证顺序?

视频处理的多步骤存在强依赖关系:

音频提取 → ASR 转写 → AI 总结 → 知识库构建
   ↑           ↑          ↑
未完成则无法进行下一步,若顺序错乱会导致:
- 任务失败(如用未转写完成的空文本调用 AI 接口)
- 产生脏数据

5.2.2 RocketMQ 顺序消费实现方案

RocketMQ 顺序消费的核心是「同一 Sharding Key 的消息进入同一 Queue,单线程消费」,结合项目场景,最优实现方案如下:

步骤实现要点具体说明
1. 选择 Sharding Key以 mediaId(视频 ID)作为 Sharding Key确保同一视频的所有步骤消息进入同一 Queue;不同视频的消息可进入不同 Queue,实现并行处理
2. 生产者发送顺序消息发送消息时指定 Sharding Keymsg.setKeys(mediaId) 或使用顺序消息 API
3. 消费者配置顺序消费设置消费模式为 ORDERLY确保同一 Queue 单线程消费
4. 优化:避免单 Queue 阻塞Topic 配置多个 Queue(建议 8 个)RocketMQ 根据 mediaId 哈希值分配 Queue,避免单个视频长时间任务阻塞全局处理;同时设置消费超时时间,防止单个任务卡住 Queue

5.3 问题三:RocketMQ 分片处理视频、保证顺序一致,会对 AI 解析总结结果产生影响吗?

核心结论: 只要保证「同一视频」的处理步骤顺序一致,RocketMQ 分片处理(多 Queue 并行)不会对 AI 解析总结结果产生任何影响;反而能提升整体处理效率,避免单视频处理阻塞全局。

5.3.1 分片处理的核心逻辑(不影响顺序)

┌─────────────────────────────────────────────────────────┐
│                    RocketMQ 分片处理架构                 │
├─────────────────────────────────────────────────────────┤
│  Queue 1 (mediaId=hash(A))  →  视频A: 提取→转写→总结→构建  │
│  Queue 2 (mediaId=hash(B))  →  视频B: 提取→转写→总结→构建  │
│  Queue 3 (mediaId=hash(C))  →  视频C: 提取→转写→总结→构建  │
│  ...                                                    │
│  同一 mediaId 始终分配到同一个 Queue,保证步骤顺序          │
│  不同 Queue 之间并行处理,互不影响                         │
└─────────────────────────────────────────────────────────┘
  • 分片依据:通过 mediaId 的哈希值分配 Queue,同一 mediaId 始终分配到同一个 Queue,保证其步骤顺序;

  • 并行逻辑:不同 Queue 之间并行处理,互不影响(如 Queue1 处理视频A的步骤,Queue2 处理视频B的步骤);

  • 顺序保证:同一 Queue 内的消息单线程消费,确保视频A的「音频提取 → ASR 转写 → AI 总结」步骤依次执行。

5.3.2 对 AI 解析总结结果无影响的关键原因

原因说明
数据隔离每个视频的处理数据(音频文件、转写文本、AI 总结结果)都通过 mediaId 关联,存储在独立的数据库记录中,分片处理不会导致数据混淆
顺序闭环AI 解析总结依赖的前置数据(ASR 转写文本),会在顺序消费中确保已完成生成,不会出现「AI 总结先执行、转写未完成」的情况
无状态消费AI 解析总结是无状态操作,仅依赖当前视频的转写文本,与其他视频的处理进度、分片位置无关,不会因分片并行产生干扰

5.3.3 潜在风险与规避方案

⚠️ 唯一潜在风险:若 Queue 分配不均(如某 Queue 分配的视频数量过多、单个视频处理耗时过长),可能导致该 Queue 内的视频 AI 总结延迟,但不会影响结果准确性。

规避方案:

  1. 合理配置 Queue 数量:建议等于消费者节点数 × 2,确保负载均衡;

  2. 长耗时视频隔离:对超过 10 分钟的视频单独分配 Topic 或 Queue,避免阻塞普通视频;

  3. 实时监控调整:通过监控实时关注各 Queue 的处理进度,及时调整消费者并发。


六、替代方案对比:为什么选 RocketMQ?

方案优点缺点适用场景
Spring @Async简单,无外部依赖应用重启任务丢失、无重试、无削峰轻量级异步
数据库轮询简单可靠延迟高(秒级)、数据库压力大低频任务
Redis 队列轻量、高性能无消费确认、无重试、无轨迹简单队列
Kafka吞吐极高、生态丰富运维重、延迟较高、Spring 集成较复杂日志、大数据
RocketMQ功能完备、延迟低、Spring 集成好社区较 Kafka 小金融级业务消息

项目选择 RocketMQ 的关键原因:

  1. 功能匹配:事务消息、顺序消息、延时消息、消息轨迹,未来都可能用到
  2. 延迟敏感:AI 分析任务需要低延迟调度(Kafka 更适合高吞吐日志)
  3. Spring 生态:rocketmq-spring-boot-starter 注解驱动,开发效率高
  4. 阿里云原生:若上云,无缝对接阿里云 RocketMQ 托管服务

七、总结:RocketMQ 重构前后对比

┌─────────────────────────────────────────────────────────────┐
│  没有 RocketMQ 的 项目                                       │
│  ├── 用户上传 500MB 视频,等待 8 分钟,最后超时失败            │
│  ├── 10 人同时上传,服务器 CPU 100%,全部失败                 │
│  ├── AI 接口 1 次超时,整个任务重来,用户体验极差              │
│  └── 新增"智能封面"功能,必须修改上传接口,回归测试两周        │
├─────────────────────────────────────────────────────────────┤
│  有 RocketMQ 的 项目                                         │
│  ├── 用户 1 秒得到响应,关闭页面,稍后收到完成通知            │
│  ├── 1000 人同时上传,系统稳如泰山,按序处理                  │
│  ├── AI 接口失败自动重试 3 次,最终失败用户可一键重试         │
│  └── 新增功能独立扩展,2 天开发上线,零影响现有功能            │
└─────────────────────────────────────────────────────────────┘

RocketMQ 在 项目中的定位:不是"锦上添花",而是支撑整个 AI 处理链路的骨架。没有它,这个系统无法从"Demo 级"进化到"生产级"。


参考代码

完整项目代码结构:

src/main/java/com/example/videoseek/
├── common/
│   ├── async/
│   │   └── AbstractRocketMQProducer.java      # 通用生产者抽象
│   └── constant/
│       └── AsyncTaskStreamConstants.java      # MQ 常量配置
├── modules/
│   ├── media/
│   │   └── listener/
│   │       ├── AnalyzeRocketMQProducer.java   # 媒体分析生产者
│   │       └── AnalyzeRocketMQConsumer.java   # 媒体分析消费者
│   ├── knowledgebase/
│   │   └── listener/
│   │       ├── VectorizeRocketMQProducer.java # 向量化生产者
│   │       └── VectorizeRocketMQConsumer.java # 向量化消费者
│   └── quiz/
│       └── listener/
│           ├── QuizEvaluateRocketMQProducer.java # 测验评估生产者
│           └── QuizEvaluateRocketMQConsumer.java # 测验评估消费者

RocketMQ研究及快速入门 RocketMQ介绍 MQ的应用场景 MQ全称为Message Queue,即消息队列, 开发中消息队列通常有如下应用场景: 1、任务异步处理 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。 传统方式: 改造后方式: 交互流程如下: 订单服务发消息到消息队列。 消息队列将消息发给仓储服务和物流服务。 仓储服务和物流服务接收到消息进行业务处理。 2、应用程序解耦合 MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。 举例:上图中 阅读详情

相关推荐

RocketMQ---常用api

就是有九十九个困难,只要有一个坚强的意志就不困难。

相信自己有能力,那么你就真的会有! 356

RocketMQ 03 常用API

RocketMQ 03 常用API

Jack方 1103

RocketMQ 为何性能高

*消费时首先获取 MessageQueue 对应的 objectLock,保证当前进程内只有一个线程在处理对应的的 MessageQueue, 从 ProcessQueue 的 msgTreeMap 中按 offset 从低到高的顺序取消息,从而保证了消息的顺序性。消息属性长度未超限;**Broker:负责接收消息的生产和消费请求,并进行消息的持久化和消息的读取。**所有的消息写入转为顺序写(相比于 Kafka,RocketMQ 即使对于 1w+ 以上的 Topic 也能够应付自如)**读写文件分离。

Wis57的博客 1119

【RocketMQ】RocketMQ入门

消息发送方在发送了一条消息后,不需要等待服务端响应即可发送第二条消息,发送方通过回调接口接收服务端响应,并处理响应结果。Push模式也是基于pull模式的,只能客户端内部封装了api,一般场景下,上游消息生产量小或者均速的时候,选择push模式。同步发送是最常用的方式,是指消息发送方发出一条消息后,会在收到服务端同步响应之后才发下一条消息的通讯方式,可靠的同步传输被广泛应用于各种场景,如重要的通知消息、短消息通知等。异步发送是指发送方发出一条消息后,不等服务端返回响应,接着发送下一条消息的通讯方式。

Decade_Faiz的博客 2275

RocketMQ分布式消息队列

为什么要使用RocketMQ,我们先来看一个天府通刷地铁出站的业务场景【注意】假如天府通出站API 和 支付系统 是不同的子系统 (两个Tomcat远程通信)上下班高峰期使用天府通刷码的人非常多,意味并发量很高,一个出站请求到后台需要做费用计算,费用结算,或者积分赠送等业务。由于并发很高,并且费用结算和积分等业务本来就耗时,况且支付服务也不一定能承担那么大的请求量。当服务器线程耗尽,后续请求会等待变慢,再加上高并发请求就会导致后续请求越来越慢,请求长时间等待,导致大量请求超时。

m0_61826771的博客 548

智能体调用GitHub API效率优化:脚本技能批处理实战

在AI智能体(Agent)开发中,高效调用外部API是提升整体性能的关键。传统基于大模型的智能体常面临Token消耗高、网络延迟大、请求串行化等瓶颈,尤其在处理复杂多步骤任务时,频繁的API交互会显著影响响应速度和成本。其核心原理在于将多次零散的API调用合并为一次批处理操作,通过脚本执行器在本地或近端环境完成数据聚合与处理,再将结构化结果返回给智能体。这种技术价值在于大幅降低网络开销与Token消耗,将交互延迟从线性增长优化为近乎恒定。在GitHub操作、数据库查询、云资源管理等应用场景中,智能体可借助脚

weixin_33895475的博客 418

RocketMQ常用API

RocketMQ学习笔记 1. RocketMQ介绍 1.1 官方API 1.1.1 概念和特性 概念(Concept):介绍RocketMQ的基本概念模型。 特性(Features):介绍RocketMQ实现的功能特性。 1.1.2 架构设计 架构(Architecture):介绍RocketMQ部署架构和技术架构。 设计(Design): 介绍RocketMQ关键机制的设计原理,主要包括消息存储、通信机制、消息过滤、负载均衡、事务消息等。 1.1.3 样例 样例(Example) :介绍Roc

清风的博客 1851

RocketMQ如何处理消息堆积

mq出现消息堆积本质上是导致的结果。处理消息堆积需要一个系统性的方法,从快速定位问题根源到实施相应的解决方案。

qq_65779957的博客 583

RocketMQ 常用API

RocketMQ 03 消息 消息消费模式 消息消费模式由消费者来决定,可以由消费者设置MessageModel来决定消息模式。 消息模式默认为集群消费模式 consumer.setMessageModel(MessageModel.BROADCASTING); consumer.setMessageModel(MessageModel.CLUSTERING); 集群消息 集群消息是指集群化部署消费者 当使用集群消费模式时,MQ 认为任意一条消息只需要被集群内的任意一个消费者处理即可。 特点 每条

alianyuanwu的博客 3089

OpenModelica入门指南:从下载安装到第一个仿真模型(附常见问题解答)

本文提供OpenModelica开源项目的完整入门指南,涵盖从下载安装、界面熟悉到构建首个仿真模型的全过程。通过创建经典的阻尼震荡系统实例,详细讲解组件拖放、参数设置、仿真运行及结果分析,并附有常见问题解决方案,帮助工程师和研究人员快速上手这一强大的多领域物理系统建模与仿真工具。

weixin_29239279的博客 730

Allegro Design Entry CIS 与 OrCAD Capture CIS:PCB设计工具链中的双雄对决

本文深入对比了Cadence旗下两大原理图设计工具Allegro Design Entry CIS与OrCAD Capture CIS。Allegro Design Entry CIS源自Concept HDL,定位高端,强调自顶向下的层次化设计和与Allegro PCB Editor的无缝约束管理,适合大型复杂系统及团队协作。OrCAD Capture CIS则以其出色的易用性、广泛的兼容性和强大的CIS数据库功能著称,是中小型项目及跨工具链协作的通用选择。文章从历史渊源、核心功能、适用场景等多维度剖析,

bush的博客 487

rocketmq 常用api(一)

消息常用API DefaultMQProducer producer = new DefaultMQProducer("xxoogp"); //设置nameserver地址 producer.setNamesrvAddr("192.168.150.113:9876"); producer.start(); //topic 消息将要发送到的地址 body消息中的具体数据 Message message = new Message("topic","xxoo第一条".getBytes()); //同步消息

randomswap的博客 1662

OPC UA 协议详解

OPC UA(统一架构)是新一代工业自动化标准通信协议,替代传统OPC Classic,具有跨平台、高安全性、标准化等优势。基于TCP协议,支持全平台部署,采用面向对象架构组织数据,提供实时读写、事件订阅、历史数据访问等功能。作为工业4.0核心协议,适用于智能制造、数字孪生等场景,能实现多品牌设备统一接入。相比Modbus和MQTT,OPC UA协议更规范安全但复杂度较高,是大型工业集群互联的主流选择。

eastyuxiao的专栏 726

RocketMQ - 批量消息发送:高效发送大量消息的技巧

本文介绍了RocketMQ批量消息发送的核心技术与实践方法。主要内容包括: 批量发送的价值 显著降低网络开销和I/O次数 提升吞吐量,适用于日志采集、数据同步等高并发场景 实现原理 协议层优化,通过MessageBatch结构合并消息 单次网络请求替代多次往返 实战应用 原生API和Spring Boot两种实现方式 自动拆分工具ListSplitter处理4MB限制 异常处理与重试机制 性能优化 批次大小动态调整 异步发送结合内存管理 实测吞吐量提升5-10倍 本文通过流程图、代码示例和性能数据,完整呈现

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

【A2DP】规范精讲[1]: 深入解析A2DP协议的核心架构

在蓝牙技术发展的早期阶段,音频传输主要通过SCO(同步面向连接)链路实现,这种设计主要针对语音通信,音质有限且功能单一。随着人们对无线高质量音频需求的增长,​​Advanced Audio Distribution Profile (A2DP)​​ 应运而生,成为蓝牙音频传输的技术基石。

byte轻骑兵的技术小窝 1万+

020、Sensor 供电设计:AVDD、DVDD、IOVDD 的上电时序与纹波要求

本文总结了图像传感器(Sensor)供电设计中的关键要点与常见问题:1. 三路供电特性差异:AVDD(模拟供电)对纹波最敏感(通常<30mVpp),DVDD需应对大电流瞬态变化,IOVDD需满足MIPI接口电压稳定要求。2. 上电时序至关重要,应遵循"模拟→数字→IO"的启动顺序,时序偏差可能导致初始化失败。3. 纹波控制需合理选择电容组合(如10μF+0.1μF),注意布局走线及电容ESR/ESL特性。4. 调试建议使用示波器多通道测量时序和纹波,重点关注传感器启动瞬间的电源特性。5. 经验教训包括预留设

sundong_81的博客 527

RocketMQ分布式消息队列(最详细)

RocketMQ认识 - RocketMQ安装 - RocketMQ原理(重要) - RocketMQ应用(重要)

weixin_48133130的博客 2万+

Python爬虫技术应用:体育赛事直播数据抓取与分析

Web爬虫(Web Crawling)是一种通过模拟浏览器行为从网站获取数据的技术。发送请求:发送HTTP请求(通常是GET或POST请求)获取目标网页的HTML内容。解析网页:使用解析工具(如lxml)从HTML中提取出所需要的信息。存储数据:将抓取到的数据存储到数据库、文件或数据结构中,供后续分析和使用。数据分析与展示:使用数据分析工具(如PandasMatplotlib)对数据进行处理、清洗和可视化,生成有价值的报告和图表。Requests:用于发送静态网页的HTTP请求并获取响应。

2201_76125261的博客 1309

消息队列——RocketMQ

MQ 全称(Message Queue)又名消息队列,是一种提供消息队列服务的中间件,也称为消息中间件,是一套提供了消息生产、存储、消费全过程 API的软件系统(消息即数据)。通俗点说,就是一个先进先出的数据结构。

m0_68965466的博客 1158

从原理到实战:深入解析 Synopsys VCS 仿真快照技术,提升验证效率

VCS Checkpoint 技术摘要 VCS Checkpoint 是 Synopsys VCS 提供的仿真状态快照功能,可将完整的仿真状态(寄存器、存储器、时钟、随机种子等)序列化保存。主要应用场景包括:跳过耗时初始化阶段、覆盖率驱动验证、Debug复现和UVM分阶段验证。核心原理是对仿真内核状态的完整序列化,需注意文件句柄等特殊对象需手动处理。 使用方式: 编译时添加 -checkpoint 选项 运行时通过 $save 系统任务或 +checkpoint 参数保存状态 通过 +restore 参数恢

元直的博客 248

【RV1126/RV1109学习笔记】#基础篇#(2)基础入门使用

一、调试方式 1、串口调试 2、ADB调试 3、网络调试 二、基础外设使用 音频使用(aplay,arecord,amixer) 三、WIFI连接 四、屏幕背光控制

丨晋丨 1858

Springboot ----RocketMQ分布式消息队列

(主动,被动),RocketMQ中的消息消费者都是以消费者组(Consumer Group)的形式出现的。消费者组是同一类消费者的集合,这类Consumer消费的是同一个Topic类型的消息,不同的 Consumer Group可以消费同一个Topic。Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。

2301_76584250的博客 701

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

RocketMQ入门(4.可靠异步发送)

原理:异步发送是指发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。MQ 的异步发送,需要用户实现异步发送回调接口(SendCallback),在执行消息的异步发送时,应用不需要等待服务器响应即可直接返回,通过回调接口接收务器响应,并对服务器的响应结果进行处理。 应用场景:异步发送一般用于链路耗时较长,对 RT 响应时间较为敏感的业务场景,例如用户视频上传后通知启动转码

onlyyjco的专栏 9946

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

RocketMQ 03 常用api

RocketMQ 03 消息 消息消费模式 消息消费模式由消费者来决定,可以由消费者设置MessageModel来决定消息模式。 消息模式默认为集群消费模式 consumer.setMessageModel(MessageModel.BROADCASTING); consumer.setMessageModel(MessageModel.CLUSTERING); 集群消息 集群消息是指集群化部署消费者 当使用集群消费模式时,MQ 认为任意一条消息只需要被集群内的任意一个消费者处理即可。 特点 每条

紫蝶侠的博客 419

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【对比学习】RocketMQ 的异步消息发送和观察者模式中的消息通知有什么区别

摘要: RocketMQ异步消息发送与观察者模式通知在机制上存在本质差异。RocketMQ采用多线程非阻塞架构,通过Broker实现消息持久化和可靠传递,支持高吞吐、分布式扩展,但依赖中间件。观察者模式则是同步阻塞的单线程通知,耦合性强且无内置可靠性保障,适合轻量级单体应用场景。二者在耦合性、可靠性、性能和扩展性方面形成鲜明对比,需根据业务需求选择。

NeoLshu的博客 898

RocketMQ—Producer(三)发送方式和消息类型

一:发送方式讲解 RocketMQ版提供三种方式来发送消息:同步(Sync)发送、异步(Async)发送和单向(Oneway)发送。 我们会介绍每种发送方式的原理、应用场景、代码差异,以及三种发送方式的对比。 1.1 同步发送 CommunicationMode#SYNC 原理: 同步发送是指发送者向MQ执行发送消息API时,同步等待,直到消息服务器返回发送结果 。 应用场景: 此种方式应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等。 同步发送接口介绍: MQPro

IT巅峰技术专栏 3892
上一篇: Apache Tika去噪音实战:解析适配AI大模型的文档文本
下一篇: 封装 Redis + Lua 实现多维度分布式限流
让代码运行一会
博客等级 码龄3年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值