首页
/ HertzBeat监控配置批量导入的性能优化实践

HertzBeat监控配置批量导入的性能优化实践

2025-06-03 07:46:27作者:龚格成

背景与问题分析

在HertzBeat 1.6.1版本中,当用户尝试批量导入大量监控配置时(例如500条配置),系统需要长达8分钟的处理时间。这个过程中存在两个主要问题:

  1. 事务处理机制:当前实现使用了类级别的@Transactional注解,导致整个批量导入过程被包裹在一个大事务中。这不仅会导致数据库连接长时间占用,还会造成用户界面无响应。

  2. 缺乏进度反馈:由于整个导入过程是同步阻塞的,用户无法感知导入进度,容易误认为系统卡死。

技术实现方案

后端优化方案

我们采用SSE(Server-Sent Events)技术实现实时进度推送:

public void importConfig(String fileName, InputStream is) {
    // 初始化进度参数
    int progressStep = 10;
    int nextPercent = progressStep;
    
    try {
        for (int i = 0; i < totalSize; i++) {
            // 单条记录处理
            monitorService.validate(formList.get(i), false);
            monitorService.addMonitor(formList.get(i).getMonitor(), 
                                    formList.get(i).getParams(),
                                    formList.get(i).getCollector(), 
                                    monitorDto.getGrafanaDashboard());
            
            // 进度计算与推送
            int currentPercent = (i + 1) * 100 / totalSize;
            if (currentPercent >= nextPercent || i == totalSize - 1) {
                emitter.send(SseEmitter.event()
                          .id(UUID.randomUUID().toString())
                          .name("IMPORT_PROGRESS")
                          .data(new ImportProgress(fileName, currentPercent, totalSize, i+1)));
                nextPercent += progressStep;
            }
        }
        // 最终成功通知
        emitter.send(SseEmitter.event()
                  .name("IMPORT_COMPLETE")
                  .data("导入成功"));
    } catch (Exception e) {
        // 异常处理
        emitter.send(SseEmitter.event()
                  .name("IMPORT_ERROR")
                  .data(e.getMessage()));
    }
}

关键设计要点:

  1. 移除了类级别的事务注解,改为每条记录独立处理
  2. 每完成10%进度或最后一条记录时推送进度事件
  3. 使用UUID作为事件ID确保唯一性
  4. 包含三种事件类型:进度更新、完成通知和错误通知

前端实现方案

前端采用响应式通知组件展示导入进度:

  1. 在页面右上角固定位置显示进度通知
  2. 进度条采用分段式动画效果
  3. 成功/失败采用不同颜色标识
  4. 通知可手动关闭或自动消失

技术决策考量

在方案设计过程中,团队重点考虑了以下因素:

  1. 数据一致性:虽然改为单条记录事务,但通过前置验证确保数据有效性
  2. 用户体验:实时进度反馈消除用户焦虑
  3. 系统性能:SSE相比WebSocket更轻量,适合单向进度通知场景
  4. 异常处理:保留详细的错误信息供用户排查问题

实施效果

优化后的版本实现了:

  • 导入过程可视化,用户可清晰看到当前进度
  • 系统资源占用更合理,避免长事务问题
  • 支持中途取消操作
  • 异常情况即时反馈

最佳实践建议

对于类似批量操作场景,建议:

  1. 避免使用大事务,改为小事务批处理
  2. 实现进度反馈机制
  3. 考虑异步处理超大数据集
  4. 提供操作历史记录功能
  5. 设计友好的错误展示方式

这种优化模式不仅适用于监控配置导入,也可推广到系统中的其他批量操作场景,如告警规则导入、用户批量创建等,是提升系统可用性的有效手段。

登录后查看全文
热门项目推荐