用途:在 NestJS 项目中实现实时功能,涵盖 WebSocket 网关与 SSE 端点,适用于聊天、协作、直播信息流、通知、行情推送和 CI 日志流等场景。
主要能力与协议选择:双向通信(聊天、多人游戏、协同编辑)选 WebSocket;单向通信(通知、实时信息流、行情、CI 日志)选 SSE,其基于标准 HTTP、便于安全加固与负载均衡;长轮询仅作降级或极低频场景,头部开销大且处理不当会阻塞线程。
实现方式:SSE 用 @Sse('route') 返回 Observable<MessageEvent>;WebSocket 用 @WebSocketGateway(),默认选 Socket.io(支持房间、命名空间与自动重连,协议较重),性能关键且不需要房间逻辑时可用 Fastify/WS 的 ws 适配器。
鉴权:WebSocket 在 handleConnection() 生命周期中验证 JWT,无效立即断开,注意普通 HTTP 守卫不会在 WS 连接上有效触发;SSE 使用标准守卫。另需对消息事件做严格限流以防洪泛。
扩展:K8s 多 Pod 下 WebSocket 需用 @socket.io/redis-adapter,各 Pod 发布到 Redis 再分发,否则跨 Pod 事件会丢失;SSE 无状态无需适配器,但规模化必须用 HTTP/2,以规避 HTTP/1.1 每域 6 连接限制。
架构约定:网关只处理客户端通信(加入房间、确认消息),业务逻辑委托给 Service 或 Command Bus;可用 AsyncApi 或 SocketApi 装饰器记录 WS 事件。
限制:资料未提供具体代码示例、价格、支持平台或效果数据。