news 2026/4/30 13:37:02

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 集群示例工程,请联系作者获取。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:54:56

从用户需求到设计:提示工程架构师设计高效界面的方法

从用户需求到设计:提示工程架构师设计高效界面的方法 一、引入:当“AI翻译官”遇到“表达困境” 小张是一家美妆品牌的新媒体运营,每天的核心工作之一是用AI生成朋友圈文案。但她总陷入同一个循环: 写提示时,要么太笼统(“帮我写一条口红的朋友圈”),AI输出的内容千篇…

作者头像 李华
网站建设 2026/5/1 5:46:40

情感分析在广告效果评估中的创新应用

情感分析在广告效果评估中的创新应用关键词&#xff1a;情感分析、广告效果评估、创新应用、自然语言处理、数据挖掘摘要&#xff1a;本文聚焦于情感分析在广告效果评估中的创新应用。首先介绍了情感分析和广告效果评估的基本概念&#xff0c;阐述了将二者结合的背景和意义。接…

作者头像 李华
网站建设 2026/5/1 5:47:40

内网渗透中的“眼睛”与“耳朵”:工作组信息收集技术全解析

内网渗透中的“眼睛”与“耳朵”&#xff1a;工作组信息收集技术全解析在授权渗透测试中&#xff0c;高效的信息收集是横向移动的基石。掌握这些命令&#xff0c;你就能像管理员一样“看见”整个系统。前言&#xff1a;为何信息收集如此重要&#xff1f; 在内网渗透测试中&…

作者头像 李华