从 15 秒到 500 毫秒:体育数据实时推送的架构演进之路

63 阅读2分钟

体育.png 作为一名深耕体育数据领域多年的技术人,今天想和大家分享一下我们在实时数据推送方面的架构演进历程。从最初的 15 秒延迟到现在的 500 毫秒以内,这中间经历了怎样的技术迭代?且听我慢慢道来。

一、原始阶段:简单的 API 轮询

最早期的架构非常简单粗暴:

javascript

复制

下载

setInterval(() => {
  fetch('/api/live-match')
    .then(res => res.json())
    .then(updateUI)
}, 10000) // 每10秒轮询一次

存在的问题:

  1. 延迟高达 15-30 秒
  2. 无效请求占比超过 60%
  3. 服务器压力大,QPS 峰值可达 5 万+

二、第一次演进:长轮询优化

为了解决简单轮询的问题,我们引入了长轮询机制:

javascript

复制

下载

function longPoll() {
  fetch('/api/live-match?longPoll=true')
    .then(res => res.json())
    .then(data => {
      updateUI(data)
      longPoll() // 立即发起下一次请求
    })
}

改进效果:

  • 延迟降低到 3-5 秒
  • 服务器负载下降 40%
  • 但移动端连接稳定性问题凸显

三、质的飞跃:API + WebSocket 混合架构

现在的架构采用了混合模式:

image.png

image.png 关键技术点:

  1. 数据分级处理

    • 静态数据:API + 本地缓存
    • 准实时数据:HTTP/2 Server Push
    • 实时数据:WebSocket 推送
  2. 移动端优化

    javascript

    复制

    下载

    // 智能心跳机制
    const heartbeatInterval = navigator.connection.effectiveType === '4g' ? 30000 : 15000
    setInterval(() => ws.send('ping'), heartbeatInterval)
    
  3. 容灾设计

    javascript

    复制

    下载

    ws.onclose = () => {
      fallbackToLongPoll()
      setTimeout(tryReconnect, 5000)
    }
    

四、性能指标对比

指标纯API轮询长轮询优化混合架构
平均延迟15s3s<500ms
服务器成本100%60%40%
移动端成功率95%85%99.5%

五、踩坑经验分享

  1. 协议选择

    • 早期尝试 MQTT,遭遇运营商 NAT 超时问题
    • 最终回归 WebSocket + 443 端口方案
  2. 数据一致性

    protobuf

    复制

    下载

    message MatchUpdate {
      string match_id = 1;
      int32 home_score = 2;
      int32 away_score = 3;
      // 使用optional保证向前兼容
      optional int32 home_yellow_cards = 4; 
    }
    
  3. 成本控制

    • 建立了实时成本监控系统
    • 每周进行成本复盘
    • 引入自动伸缩机制

六、未来规划

  1. 边缘计算:将 WS 网关下沉到 CDN 边缘节点
  2. 智能压缩:基于 LSTM 的差分算法预测
  3. 新协议探索:评估 WebTransport 的可行性

结语

架构演进永无止境。从 15 秒到 500 毫秒的优化之路,让我们深刻体会到:没有最好的架构,只有最适合业务发展的架构。期待与各位技术同仁交流更多实践经验。

思考题:在你们的业务场景中,是如何平衡实时性和系统成本的?欢迎在评论区分享你的见解。