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

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.xdnf.cn/news/16469.html

相关文章:

  • 数据库HB OB mysql ck startrocks, ES存储特点,以及应用场景
  • 树上倍增和LCA问题
  • 【Zephyr】Window下的Zephyr编译和使用
  • 数学建模国赛历年赛题与优秀论文学习思路
  • 考研复习-数据结构-第八章-排序
  • 洛谷 P1217:[USACO1.5] 回文质数 Prime Palindromes
  • Android开发中线上crash问题解决流程
  • [spring6: Mvc-函数式编程]-源码解析
  • 栈----2.最小栈
  • 单元测试、系统测试、集成测试知识详解
  • 面试150 只出现一次的数字
  • Java I/O知识归纳
  • 字符串操作
  • ESP32实战:5分钟实现PC远程控制LED灯
  • AI Agent笔记--读腾讯技术公众号
  • dify前端应用相关
  • Java中List集合对象去重及按属性去重
  • 学习随想录-- web3学习入门计划
  • Flutter开发实战之路由与导航
  • Flink是如何实现物理分区?
  • 39.Python 中 list.sort() 与 sorted() 的本质区别与最佳实践
  • C语言开发工具Win-TC
  • Python+Selenium+Pytest+POM自动化测试框架封装
  • C++高效实现AI人工智能实例
  • Flutter开发实战之原生平台集成
  • Flutter开发实战之动画与交互设计
  • 06-ES6
  • Ubuntu22.04提示找不到python命令的解决方案
  • Java 注解(Annotation)详解:从基础到实战,彻底掌握元数据驱动开发
  • 微信小程序 自定义带图片弹窗