Skip to main content

没有固定上限,通常取决于硬件、配置和优化水平,一个 NestJS 服务器(Node.js)可以轻松处理几千到几万甚至更多并发 SSE 连接。

关键影响因素

  1. 服务器硬件和系统限制

    • 内存:每个 SSE 连接主要占用少量内存(保持打开的 socket + 少量缓冲),但成千上万连接时内存会累积。
    • 文件描述符(ulimit):Linux 默认可能只有 1024,需要调高(ulimit -n 65535 或更高)。
    • CPU 和网络带宽:SSE 是长连接,低频推送时 CPU 压力小;高频广播或大量客户端时需要注意。
    • 操作系统 TCP 栈:需要调优(如 somaxconntcp_max_syn_backlog 等)。
  2. Node.js / NestJS 特性

    • Node.js 是单线程事件循环模型,非常适合 I/O 密集的长连接(如 SSE),不适合 CPU 密集任务
    • NestJS 默认用 Express,性能不错;强烈推荐切换到 Fastify 适配器,性能可提升 2-3 倍(吞吐量更高,资源占用更低)。
    • SSE 在 NestJS 中通过 @Sse() 装饰器实现,保持响应流打开。
  3. 实际案例和基准

    • 单个 Node.js 进程:几千到 1-2 万 并发 SSE 很常见,经过优化可达几万。
    • Reddit 等讨论中,有人提到 10k SSE 连接 + Redis Pub/Sub 是可行的,不会明显拖慢服务器(前提是事件不频繁)。
    • 更高规模(如 LinkedIn 案例)单机可达数十万,但通常需要水平扩展 + 负载均衡。
    • 测试中有人在优化后单机达到 28k+ SSE 连接。

浏览器端的限制(很重要!)

  • HTTP/1.1:每个域名浏览器通常只允许 6 个 并发连接(所有标签页共享)。SSE 会占用一个,导致其他请求被阻塞。
  • HTTP/2 / HTTP/3:通过多路复用(multiplexing),一个 TCP 连接可承载上百个流,极大缓解 这个问题(默认 ~100 streams,可协商更高)。推荐生产环境强制使用 HTTP/2。

提升并发能力的实用建议(NestJS)

  • 使用 Fastify 适配器@nestjs/platform-fastify
  • 水平扩展:用 PM2 Cluster / Kubernetes + Redis(或 Kafka)做 Pub/Sub 广播消息,避免单点。
  • 反向代理:Nginx / Traefik / Cloudflare 做负载均衡 + HTTP/2 终止。
  • 连接管理
    • 实现心跳(每 15-30s 发送 : ping)。
    • 客户端断开时及时清理(res.on('close'))。
    • 设置合理超时和最大连接数保护。
  • 优化事件循环:避免阻塞操作,用 Redis 等外部存储解耦。
  • 监控:用 Prometheus + Grafana 监控连接数、内存、事件循环延迟。

总结

  • 小型应用(几百~几千用户):一台中等配置服务器就够。
  • 中大型实时应用:单机 1-3 万 是现实目标,再高就必须集群 + 消息队列