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

SSE、长轮询与 WebSocket 连接资源对比及 Spring Boot 配置指南

一、背景

在构建实时消息推送系统时,开发者常面临三种主流技术选型:

  • 长轮询(Long Polling)
  • SSE(Server-Sent Events)
  • WebSocket

三者在连接模型、资源消耗、扩展性等方面差异显著。本文旨在对比其连接资源占用特性,并提供Spring Boot 项目中的最佳实践与配置建议


二、连接模型与资源消耗对比

特性长轮询SSEWebSocket
通信方向客户端拉(伪推)服务器 → 客户端(单向)双向
连接类型短连接(但 hold 住)持久 HTTP 连接TCP 升级后独立连接
是否长期占用 HTTP 连接✅ 是(每次请求 hold 30~60s)✅ 是(连接持续打开)❌ 否(脱离 HTTP 协议栈)
线程模型每请求占 1 线程(阻塞)异步非阻塞(不占处理线程)异步非阻塞(NIO)
并发连接压力⚠️ 极高(易线程爆炸)⚠️ 高(受 socket 数限制)✅ 低(单线程可处理数千连接)
适用场景兼容老旧系统(最后选择)通知、日志、行情等单向推送聊天、游戏、协作编辑等双向交互

核心结论

  • 长轮询资源消耗最大,应避免用于高并发场景
  • SSE 比长轮询高效,适合中等规模单向推送
  • WebSocket 是高并发、低延迟、双向通信的首选

三、Spring Boot 中的连接数配置

3.1 Web 容器选择建议

容器适用场景优势
Tomcat默认,通用场景稳定、生态完善
Undertow推荐用于 SSE / 长轮询内存占用低,支持高并发连接
Netty(WebFlux)超高并发或 Reactive 架构完全非阻塞,单机支持 10w+ 连接

🔧切换为 Undertow(Maven)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency>

3.2 Tomcat 配置(application.yml)

server:tomcat:max-connections:20000# 最大 socket 连接数(默认 8192)accept-count:200# 请求等待队列大小threads:max:500# 处理线程数(SSE 建立后不占此线程)min-spare:50connection-timeout:60000# 连接超时(毫秒)

⚠️注意:SSE 连接建立后不占用threads.max,但受max-connections限制。


3.3 Undertow 配置(推荐)

server:undertow:io-threads:8# IO 线程数 ≈ CPU 核数worker-threads:200# 阻塞任务线程buffer-size:1024queues:task:1024# 任务队列大小

✅ Undertow 默认支持数万并发连接,内存效率优于 Tomcat。


3.4 系统级限制(Linux)

每个 TCP 连接 ≈ 1 个文件描述符(fd),需调整系统限制:

# 查看当前限制ulimit-n# 临时提升(需 root)ulimit-n65536# 永久生效:编辑 /etc/security/limits.conf* soft nofile65536* hard nofile65536

💡 建议:ulimit -n≥ 预期最大连接数 × 1.2


四、容量估算与选型建议

用户规模推荐方案关键配置
< 1,000SSE + Tomcat默认配置即可
1,000 ~ 50,000SSE + Undertow + Redis Pub/Submax-connections=50000+ulimit -n 65536
> 50,000 或需双向通信WebSocket + NettyWebFlux Reactive SSE集群部署 + 连接分片

五、SSE 项目优化 Checklist

  • 使用Undertow替代 Tomcat(降低内存)
  • 配置server.undertow.max-connections足够大
  • 系统ulimit -n调高(> 连接数 × 1.2)
  • 使用 Spring 的SseEmitter(已支持异步)
  • 及时清理失效连接(注册onTimeout/onError回调)
  • 集群环境使用Redis Pub/Sub广播消息
  • 通过/actuator/metrics监控在线连接数

六、附:Reactive SSE(WebFlux)示例(超高并发)

@GetMapping(value="/events",produces=MediaType.TEXT_EVENT_STREAM_VALUE)publicFlux<ServerSentEvent<String>>events(){returnFlux.interval(Duration.ofSeconds(1)).map(seq->ServerSentEvent.builder("tick-"+seq).build());}

✅ 基于 Reactor 模型,单机可支持10万+ 并发连接,适合大型实时系统。


七、总结

问题回答
SSE 会占用很多 HTTP 连接吗?✅ 会,每个用户占 1 个持久 HTTP 连接,但比长轮询高效得多
WebSocket 会占用很多连接吗?❌ 不会,基于 NIO,连接成本极低
Spring Boot 需要配置连接数吗?必须配置!尤其是max-connections和系统ulimit

🎯选型口诀
单向推送用 SSE,双向交互选 WebSocket,长轮询仅作兜底。


📌文档结束
如需完整可运行的 Spring Boot + SSE + Redis 集群示例工程,请联系作者获取。


http://www.jsqmd.com/news/226289/

相关文章:

  • AWS推出AI图像编辑新突破:用说话就能精准移动图片中的物体!
  • 雷家林(レイ・ジアリン)詩歌集録 その十五(日译版)
  • 让 RAP 弹窗参数真正变成必填:Excel Upload Action 的两种实现路径
  • 《呼吸秋千》我早已习惯,饥饿在呼吸上荡起秋千
  • 2026必备!专科生毕业论文TOP8 AI论文网站测评
  • 香港科技大学突破文本理解难题:让AI模型内部“自我改造“
  • 光谱共焦技术在高精度尺寸与3D表面缺陷检测中的工业应用研究
  • 网页接收服务端消息的几种方式
  • IP协议 地址划分MAC地址作用ip addr命令
  • 斯坦福大学等发布:AI助手在企业政策执行上“偏科“得如此严重
  • 从用户需求到设计:提示工程架构师设计高效界面的方法
  • Java对象创建的过程
  • 提示工程架构师推荐:社交网络提示设计的10个高效工具
  • 交通仿真软件:Paramics_(4).网络创建与编辑
  • JVM 内存溢出和死锁检测
  • 清华字节跳动首创视频换脸新纪元:让照片主角完美融入视频场景
  • 交通仿真软件:Paramics_(5).交通流仿真
  • 阿尔伯塔大学新突破:让AI学会自我检查错误,准确率远超人工审核
  • 交通仿真软件:Paramics_(3).交通网络建模基础
  • 交通仿真软件:Paramics_(3).数据输入与处理
  • 上海交大突破:单一AI模型实现全视觉创作任务
  • 交通仿真软件:Paramics_(2).交通仿真基础理论
  • 从案例到技巧:Agentic AI提示设计的实战总结(提示工程架构师版)
  • 交通仿真软件:Aimsun_(21).交通仿真中的数据分析
  • 【图像加密】基于matlab混沌系统和DNA编码图像加密解密【含Matlab源码 14898期】含论文
  • 这款甘特图我愿称之为2026年最强!免费开源太良心![特殊字符]
  • 基于C++的《Head First设计模式》笔记——抽象工厂模式
  • 读懂 sap.m.URLHelper 文档里的 library: sap.m 与 Module: sap/m/library
  • macOS恢复模式终端备份脚本:无依赖、保层级、避冲突的完整方案
  • 【图像传输】基于matlab GUI格雷码编码MPSK图像传输系统【含Matlab源码 14896期】含报告