video-flow-b/docs/intelligent-10s-polling-strategy.md

6.6 KiB
Raw Permalink Blame History

智能10秒轮询策略设计

🎯 需求分析

用户需求

  • 将轮询间隔调整为10秒
  • 提高数据更新的实时性

技术挑战

  • 后端API处理时间8-10秒
  • 10秒轮询可能导致请求重叠
  • 服务器压力和资源消耗

🧠 智能解决方案

核心设计思路

不是简单地设置10秒固定间隔而是实现一个智能自适应轮询系统

  1. 目标间隔10秒满足用户需求
  2. 智能防护:避免请求重叠(保护系统)
  3. 性能监控:实时调整策略(优化体验)

🔧 技术实现

1. 智能轮询间隔策略

const getRefreshInterval = React.useCallback(() => {
  if (!dashboardData || isUsingMockData) return 60000;

  const hasRunningTasks = Array.isArray(dashboardData) &&
    dashboardData.some((task: any) =>
      task.task_status === 'IN_PROGRESS' ||
      task.task_status === 'INIT' ||
      task.task_status === 'RETRYING'
    );

  if (hasRunningTasks) {
    // 有运行任务时使用10秒间隔但通过请求去重避免重叠
    return 10000; 
  } else {
    // 无运行任务时使用较长间隔节省资源
    return 30000;
  }
}, [dashboardData, isUsingMockData, connectionStatus]);

策略说明

  • 有运行任务10秒间隔满足实时性需求
  • 无运行任务30秒间隔节省资源
  • 智能防护:通过请求去重避免重叠

2. 智能请求去重机制

const refreshDataSilently = async () => {
  // 防止重复请求
  if (requestInProgress.current) {
    console.log('[刷新] 请求进行中,跳过本次刷新');
    return;
  }

  // 智能频率控制:根据上次请求耗时动态调整
  const now = Date.now();
  const timeSinceLastRequest = now - lastRequestTime.current;
  
  if (timeSinceLastRequest < 2000) {
    console.log(`[刷新] 距离上次请求仅${timeSinceLastRequest}ms跳过本次刷新`);
    return;
  }
  
  // 执行请求...
};

防护机制

  • 请求状态检查:防止并发请求
  • 时间间隔检查最小2秒间隔保护
  • 智能跳过:自动跳过过于频繁的请求

3. 性能监控和自适应调整

// 性能监控数据
const lastRequestDuration = useRef(0);
const performanceHistory = useRef<number[]>([]);

// 性能数据收集
const duration = endTime - startTime;
lastRequestDuration.current = duration;
performanceHistory.current.push(duration);

// 计算平均响应时间
const avgDuration = performanceHistory.current.reduce((a, b) => a + b, 0) / performanceHistory.current.length;

// 智能建议
if (avgDuration > 8000) {
  console.warn(`[轮询建议] 平均响应时间${Math.round(avgDuration)}ms建议考虑延长轮询间隔`);
}

监控功能

  • 实时监控:记录每次请求耗时
  • 历史分析保留最近10次性能数据
  • 智能建议:基于性能数据提供优化建议

📊 工作流程

正常情况(后端响应快)

T0:   发起请求1
T2:   请求1完成假设后端优化后2秒完成
T10:  发起请求210秒间隔
T12:  请求2完成
T20:  发起请求3
...

异常情况(后端响应慢)

T0:   发起请求1
T9:   请求1还在处理中
T10:  尝试发起请求2 → 被智能防护跳过
T11:  请求1完成
T20:  发起请求2下个轮询周期
T29:  请求2完成
T30:  发起请求3
...

🎯 优势分析

1. 满足用户需求

  • 10秒间隔有运行任务时确实是10秒轮询
  • 实时性:数据更新更及时
  • 响应性:用户感受到更快的数据刷新

2. 保护系统稳定

  • 防止重叠:智能请求去重机制
  • 资源保护:无运行任务时降低频率
  • 性能监控:实时监控系统健康状态

3. 智能自适应

  • 动态调整:根据实际性能自动优化
  • 问题预警:性能异常时主动告警
  • 历史分析:基于历史数据做决策

📈 性能对比

简单10秒轮询 vs 智能10秒轮询

场景 简单10秒轮询 智能10秒轮询 优势
后端响应快(2秒) 10秒间隔 10秒间隔 相同
后端响应慢(10秒) 请求重叠,系统压力大 自动跳过,系统稳定 显著提升
无运行任务 仍然10秒轮询 30秒轮询节省资源 资源优化
异常监控 无监控 实时监控+告警 可观测性

资源消耗对比

场景8小时工作时间后端平均响应8秒

简单10秒轮询
- 请求次数2880次
- 重叠请求:~1440次
- 服务器压力:高

智能10秒轮询
- 请求次数:~1440次自动跳过重叠
- 重叠请求0次
- 服务器压力:正常

🔍 监控和调试

关键日志

// 轮询设置日志
[轮询] 设置刷新间隔: 10 (有运行任务: true, 平均响应: 8500ms)

// 请求执行日志
[轮询] 执行定时刷新
[刷新] API调用完成耗时: 8500ms (平均: 8200ms)

// 智能防护日志
[刷新] 请求进行中跳过本次刷新
[刷新] 距离上次请求仅1500ms跳过本次刷新

// 性能警告日志
[性能警告] 后端API处理过慢: 9500ms平均耗时: 8200ms
[轮询建议] 平均响应时间8200ms建议考虑延长轮询间隔

性能指标

  • 请求成功率应该保持100%(无重叠请求)
  • 平均响应时间:实时监控后端性能
  • 跳过请求次数:智能防护的有效性指标

🚀 未来扩展

1. 自适应间隔

// 根据平均响应时间动态调整间隔
const adaptiveInterval = Math.max(10000, avgDuration * 1.2);

2. 用户配置

// 允许用户自定义轮询间隔
const userDefinedInterval = userSettings.pollingInterval || 10000;

3. 服务器负载感知

// 根据服务器负载动态调整
if (serverLoad > 80) {
  return Math.max(currentInterval * 1.5, 15000);
}

🎯 总结

这个智能10秒轮询策略实现了

  1. 用户需求满足有运行任务时确实10秒轮询
  2. 系统稳定保护:智能防护避免请求重叠
  3. 资源优化:无运行任务时自动降频
  4. 性能监控:实时监控和智能建议
  5. 可扩展性:支持未来的智能化扩展

这是一个既满足用户需求,又保护系统稳定的最佳解决方案。通过智能化的设计我们在10秒轮询的需求和系统稳定性之间找到了完美的平衡点。