Comet(又称反向Ajax)通过两种典型方式实现数据推送:
长轮询(Long Polling)
客户端发起请求后,服务器保持连接打开直至有数据更新或超时(通常30-60秒),数据返回后客户端立即发起新请求,典型响应流程:
app.get('/stream', (req, res) => { const dataWatcher = setInterval(() => { if (newDataAvailable()) { res.json(fetchData()); clearInterval(dataWatcher); } }, 500); req.on('close', () => clearInterval(dataWatcher)); });
永久帧(Forever Frame)
在页面嵌入隐藏的<iframe>
,服务器通过持续输出script标签实现数据推送
虽然传统Comet仍然有效,但建议结合新技术构建更高效的实时系统:
技术方案 | 延迟 | 协议 | 适用场景 |
---|---|---|---|
WebSocket | <100ms | TCP | 双向高频交互 |
Server-Sent Events | 200ms | HTTP/2 | 单向数据流 |
MQTT over WS | 50ms | TCP/UDP | IoT设备通信 |
推荐工具链:
npm install socket.io # 全双工通信 npm install ws # 轻量级WebSocket npm install mqtt.js # IoT场景支持
连接管理
使用Redis Cluster实现多节点会话同步:
const redisAdapter = require('socket.io-redis'); io.adapter(redisAdapter({ host: 'redis-cluster.example.com', port: 6379 }));
负载处理
Cluster模块实现多核利用:
const cluster = require('cluster'); if (cluster.isMaster) { for (let i = 0; i < os.cpus().length; i++) cluster.fork(); } else { http.createServer(app).listen(3000); }
传输压缩
启用Brotli压缩提升效率:
app.use(compression({ level: zlib.constants.BROTLI_PARAM_QUALITY_11, threshold: 1024 }));
随着HTTP/3协议的普及,基于QUIC的WebTransport等新技术正在重塑实时通信格局,建议开发者根据具体场景需求选择技术方案:对延时敏感场景优先考虑WebSocket,需要向下兼容时可采用Socket.io等封装库,IoT领域可探索MQTT协议栈。
参考资料:
[1] Node.js官方文档 – Cluster模块
[2] IETF RFC 6455 WebSocket协议标准
[3] Mozilla MDN – Server-Sent Events规范
[4] Socket.IO官方基准测试报告