当前位置: 首页 > news >正文

SSE (Server-Sent Events) 服务出现连接卡在 pending 状态的原因

SSE (Server-Sent Events) 和 WebSocket (WSS) 服务出现连接卡在 pending 状态的原因,主要与 Nginx 的 缓冲机制 和 代理行为 有关

1. Nginx 默认的 proxy_buffering on 如何影响 SSE/WSS

Nginx 默认开启 proxy_buffering on,其行为如下:

  • 缓冲响应数据:Nginx 会先完整接收上游服务器(如 http://172.18.117.82:31609)的响应,再转发给客户端。

  • 分块传输禁用:对于流式协议(如 SSE/WSS),缓冲会强制等待响应完成,破坏了实时性。

对 SSE 的影响
  • SSE 依赖 长连接 和 流式传输,需要数据实时到达客户端。

  • 如果 Nginx 开启缓冲,会等待上游服务的数据积累到一定量(或超时)后才发送,导致客户端长时间处于 pending 状态。

对 WebSocket (WSS) 的影响
  • WebSocket 是双向全双工协议,需要 即时传输

  • 缓冲可能导致握手响应被延迟,连接无法正确升级(Upgrade: websocket)。


2. 为什么 proxy_buffering off; 能解决问题?

关闭缓冲后:

  • 数据实时透传:Nginx 会立即将上游服务器的数据转发给客户端,不等待缓冲填满。

  • 支持流式传输:SSE 的事件流和 WebSocket 的帧可以即时到达客户端。

  • 保持长连接活跃:避免因缓冲超时中断连接。

3. 总结

配置项默认值对 SSE/WSS 的影响推荐值
proxy_bufferingon缓冲导致数据延迟,连接卡在 pendingoff
proxy_cache视全局配置缓存会破坏实时性off
proxy_read_timeout60s短超时会中断长连接86400s
Upgrade 头WebSocket 必需显式设置

根本原因
Nginx 的默认缓冲行为与流式协议(SSE/WSS)的实时性要求冲突,导致数据被延迟发送,表现为 pending。通过 proxy_buffering off 禁用缓冲即可解决。

对于 Server-Sent Events (SSE) 服务,除了设置 proxy_buffering off; 外,强烈建议同时设置 proxy_cache off;,以确保 SSE 的事件流能实时、正确地传输到客户端。

  1. SSE 是长连接、实时流式协议

    • SSE 依赖 HTTP 长连接,持续推送事件(text/event-stream)。

    • 如果 Nginx 启用缓存(proxy_cache on),可能会错误地缓存流式响应,导致客户端收不到新事件。

  2. Nginx 默认缓存行为的影响

    • 即使没有显式配置 proxy_cache,Nginx 仍可能因全局缓存设置或 proxy_cache 默认值影响 SSE。

    • 缓存会导致:

      • 事件延迟:客户端可能收到旧数据。

      • 连接中断:缓存机制可能提前关闭连接。

  3. proxy_buffering off 不足以保证实时性

    • proxy_buffering off 确保数据不缓冲,但 proxy_cache on 仍可能导致响应被缓存。


http://www.lryc.cn/news/600765.html

相关文章:

  • 2025微前端架构研究与实践方案
  • JavaScript里的string
  • 前端设计中如何在鼠标悬浮时同步修改块内样式
  • 【机器学习深度学习】LLamaFactory微调效果与vllm部署效果不一致如何解决
  • k8s的nodeport和ingress
  • 什么是JUC
  • Voxtral Mini:语音转文本工具,支持超长音频,多国语音
  • 9.3 快速傅里叶变换
  • Docker常用命令详解:以Nginx为例
  • gig-gitignore工具实战开发(五):gig add完善
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 热词评论查询功能实现
  • Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
  • Android ADB命令之内存统计与分析
  • Java学习|黑马笔记|Day23】网络编程、反射、动态代理
  • 深入理解C语言快速排序与自省排序(Introsort)
  • 安卓服务与多线程
  • 学习嵌入式的第三十天-数据结构-(2025.7.21)网络编程
  • 系统性学习C语言-第二十三讲-文件操作
  • 台式电脑有多个风扇开机只有部分转动的原因
  • Matlab自学笔记六十五:解方程的数值解法(代码速成)
  • Nacos-服务注册,服务发现(二)
  • 八股文整理——计算机网络
  • 容器化成本优化:K8s资源请求与限制的黄金法则——从资源画像分析到25%成本削减的实战指南
  • 记录和分享抓取的数字货币和大A时序数据
  • 什么是ICMP报文?有什么用?
  • Matlab学习笔记:自定义函数
  • java基础(day16)set-map
  • DAY24 元组和OS模块
  • 【安全漏洞】网络守门员:深入理解与应用iptables,守护Linux服务器安全
  • Java基础-文件操作