背景
系统已经打造了一款基于专家算法规则的RCA根因分析策略。
算法规则很快,每次大面积异常时,基本可以秒级推断获得结果。
但是算法的信息不够人性化,所以希望结合 AI 大模型,将异常的 cmdb/Trace 关系,报警信息+变更事件+指标+日志上下文丢给大模型分析,但是这个过程非常慢。
所以每次页面请求专家算法推断之后,希望异步调用AI解析。后续如果解析完成,可以查库填充相关信息。
问题:AI 分析的特别慢,一般5分钟以上,如何避免重复解析?给一套完整的解决方案
技术选型:后端 java(springboot) + mysql 数据库
chat
基本方案
明白,你的场景是:专家规则算法秒级响应,但是 AI 模型分析慢(5 分钟以上),你希望异步调用 AI 分析,并且避免重复解析。
下面我帮你梳理一套完整、可落地的方案。
1️⃣ 核心思路
- 秒级响应:前端请求直接调用专家算法规则,立即返回 RCA 初步结果。
 - 
    
异步 AI 分析:
- 提交任务给后台异步队列(任务ID + 数据)
 - 后台调用 AI 模型解析
 - AI 解析结果落库
 
 - 
    
去重策略:
- 对同一异常事件生成唯一标识(hash 或 UUID)
 - 查询数据库,如果已有解析记录且状态完成,则直接返回
 
 - 
    
前端展示策略:
- 初次返回专家规则结果
 - 页面轮询/推送(WebSocket / SSE)获取 AI 分析状态
 - AI 分析完成后填充界面
 
 
2️⃣ 数据库设计示例(MySQL)
CREATE TABLE rca_ai_analysis (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    incident_id VARCHAR(128) NOT NULL, -- 异常事件唯一标识
    status ENUM('PENDING','PROCESSING','DONE','FAILED') NOT NULL DEFAULT 'PENDING',
    input_data JSON NOT NULL,           -- cmdb/trace/日志/指标/报警上下文
    result_data JSON,                   -- AI 解析结果
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_incident (incident_id) -- 避免重复解析
);
status表示 AI 分析状态input_data保存传给 AI 的上下文result_data保存 AI 返回的结构化结果incident_id保证同一异常只解析一次
3️⃣ 后端 Java(SpringBoot) 异步处理方案
3.1 使用队列异步处理
推荐使用 Spring Boot + RabbitMQ / Kafka / 内存队列:
@Service
public class RcaAiService {
    @Autowired
    private RcaAiRepository repository;
    @Async
    public void submitAiAnalysis(String incidentId, String inputDataJson) {
        // 先写入数据库,状态为 PENDING
        RcaAiEntity entity = new RcaAiEntity();
        entity.setIncidentId(incidentId);
        entity.setStatus("PENDING");
        entity.setInputData(inputDataJson);
        try {
            repository.save(entity);
        } catch (DataIntegrityViolationException e) {
            // 已存在,直接跳过重复提交
            return;
        }
        // 异步执行
        processAiAnalysis(entity);
    }
    @Async
    public void processAiAnalysis(RcaAiEntity entity) {
        entity.setStatus("PROCESSING");
        repository.save(entity);
        try {
            String result = callAiModel(entity.getInputData());
            entity.setResultData(result);
            entity.setStatus("DONE");
        } catch (Exception e) {
            entity.setStatus("FAILED");
        } finally {
            repository.save(entity);
        }
    }
    private String callAiModel(String inputDataJson) {
        // 调用外部慢速 AI 模型接口,可能 5 分钟以上
        // 返回 JSON 结果
    }
}
- 利用 
@Async或消息队列异步执行 DataIntegrityViolationException避免重复解析- 记录状态,便于前端查询
 
3.2 前端轮询 / 推送
- 轮询:
 
async function fetchAiResult(incidentId) {
    const res = await fetch(`/rca/ai-result/${incidentId}`);
    const data = await res.json();
    if(data.status !== 'DONE') {
        setTimeout(() => fetchAiResult(incidentId), 5000);
    } else {
        updateUiWithAiResult(data.result);
    }
}
- 
    
WebSocket/SSE 推送(推荐):
- 当 AI 分析完成时,服务端推送消息到前端,前端直接填充界面
 - 减少轮询压力
 
 
4️⃣ 避免重复解析策略
- 
    
唯一键去重:
- 数据库表 
incident_id唯一约束 - 第一次提交解析,如果重复提交直接跳过
 
 - 数据库表 
 - 
    
缓存优化:
- 可以用 Redis 缓存 
incidentId -> status,避免每次查询数据库 
 - 可以用 Redis 缓存 
 - 
    
幂等操作:
- AI 任务提交操作设计为幂等,不会重复触发模型调用
 
 
5️⃣ 异常容错与超时
- AI 分析超时 → 标记 
FAILED,可重新触发 - 可以设置任务最大执行时间(例如 10 分钟),超过自动失败
 - 日志记录 AI 异常,便于运维
 
6️⃣ 流程总结图(文字版)
前端请求
    ↓
专家算法推断(秒级返回)
    ↓
异步提交 AI 解析任务
    ↓
数据库记录状态 PENDING → PROCESSING
    ↓
AI 分析完成 → 更新数据库 DONE
    ↓
前端轮询/推送获取结果 → 更新 UI
✅ 关键点总结:
- 专家算法秒级返回,保证用户体验。
 - AI 分析异步执行,避免阻塞。
 - 数据库唯一键 + 状态字段 + 幂等提交,避免重复解析。
 - 前端轮询或 WebSocket/SSE 获取 AI 结果。
 - 可扩展为分布式队列 + 多 AI worker,提高吞吐。
 
