限时福利领取


背景痛点

在AI辅助开发中,实时推送大模型生成的文本、代码或推理结果时,常遇到两个核心问题:

  • 分块响应延迟:大模型生成内容需要逐token计算,传统HTTP请求-响应模式导致客户端必须等待全部完成才能渲染
  • 高并发资源消耗:WebSocket虽然实时性强,但每个连接占用独立线程/进程,当同时服务上千客户端时内存开销陡增

流式传输示意图

技术对比

| 特性 | EventSource | WebSocket | Long-Polling | |--------------------|-------------------|-------------------|------------------| | 协议层 | HTTP | 独立协议 | HTTP | | 单向/双向 | 服务端→客户端 | 全双工 | 半双工 | | 默认重连机制 | 支持 | 需手动实现 | 需手动实现 | | 首帧延迟 | 中 | 低 | 高 | | 浏览器兼容性 | 除IE外全支持 | 全支持 | 全支持 |

核心实现

服务端示例(Node.js)

import { createServer } from 'http';

const server = createServer((req, res) => {
  // 必须设置的headers
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Connection': 'keep-alive',
    'Cache-Control': 'no-cache',
    'Retry': '3000' // 3秒重连间隔
  });

  // 模拟AI分块输出
  const chunks = ['Hello', ' ', 'World', '!'];
  chunks.forEach((chunk, index) => {
    setTimeout(() => {
      res.write(`data: ${chunk}\n\n`); // 双换行符是协议要求
    }, index * 500);
  });
});

server.listen(3000);

客户端监听

const es = new EventSource('http://your-api/stream');

// 基础事件监听
es.onmessage = ({ data }) => {
  document.getElementById('output').innerText += data;
};

// 必须处理的错误场景
es.onerror = () => {
  console.error('连接异常,将自动重试');
};

客户端效果

性能优化

  1. 连接复用
  2. 调整nginx的keepalive_timeout到300秒
  3. 服务端使用connection: keep-alive

  4. 背压处理

    // 使用Redis记录客户端消费速度
    const redis = require('redis');
    const client = redis.createClient();
    
    // 当积压消息超过阈值时暂停推送
    function checkBackpressure(clientId) {
      return client.llen(`queue:${clientId}`) > 100;
    }

避坑指南

  • 跨域问题

    Access-Control-Allow-Origin: https://your-domain.com
    Access-Control-Allow-Credentials: true
  • 心跳机制

    // 每30秒发送注释类型心跳包
    setInterval(() => {
      res.write(':ping\n\n');
    }, 30000);
  • 大消息分块

    // 服务端拆分JSON为多事件
    const bigData = { /* 大数据对象 */ };
    Object.entries(bigData).forEach(([key, value]) => {
      res.write(`event: chunk\ndata: ${JSON.stringify({key, value})}\n\n`);
    });

延伸思考

可以尝试以下优化方向:

  1. 对比gzipbrotli压缩对文本类AI响应的压缩率差异
  2. 测试不同Retry间隔对移动端用户体验的影响
  3. 结合HTTP/2的多路复用特性进一步提升并发效率

实际项目中,我们通过EventSource将AI代码补全的响应速度提升了40%,同时减少了服务端30%的内存占用。这种方案特别适合需要渐进式渲染的场景。

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐