websocket在秒杀场景下连接过多的问题

这可能是很多人第一次在高并发场景(尤其是秒杀活动)引入 WebSocket 时最容易忽略的隐患点之一
有两点非常关键:

1️⃣ 高并发场景下 WebSocket 连接数过多;
2️⃣ WebSocket 是否占用 Spring Boot / Tomcat 的 Web 层资源,会不会影响吞吐量。

我们下面一步步拆解,先讲本质,再给出在高并发秒杀系统中的优化与架构实践方案


一、WebSocket 的连接本质与资源消耗

WebSocket 建立连接后,本质上是一个 TCP 长连接
底层对应操作系统的 Socket 连接 + 一些用户态对象(Session、Buffer 等)。

对于每个连接,服务器端主要会占用三类资源:

资源类型说明典型占用
TCP Socket 内核 fd 描述符 + TCP buffer 每连接约 1~2KB
应用对象 WebSocketSession + 用户上下文 每连接约 2~5KB
线程 / EventLoop 如果用阻塞 IO,线程可能被阻塞 依框架模型不同

举个例子:

  • 10 万连接 × 3KB = 300MB;

  • 1 百万连接 × 3KB = 3GB;
    资源上不是“不能接受”,关键在于并发 IO 线程模型


二、Tomcat 与 WebSocket 的线程模型(重点)

Spring Boot 默认内嵌的 WebSocket 实现使用的是 Tomcat (BIO/NIO)
其线程模型大致如下:

  • HTTP 请求 → 占用 Tomcat 的 Request-Worker 线程,处理完释放;

  • WebSocket 连接 → 一旦升级成功,不再复用原 HTTP 线程;

    • Tomcat 会用内部的 NIO Selector 来管理连接;

    • 每个连接不会占用独立线程;

    • 但仍然消耗一定的内核资源与 JVM 内存。

👉 所以结论是:

WebSocket 连接建立后不会长期占用 Tomcat 的 HTTP worker 线程,
但仍占用内核 fd、NIO selector、内存等资源。

不过 Tomcat 并不擅长管理海量长连接(比如 10 万+),
它是传统 Web 应用容器,不是高并发推送服务器。
在秒杀这种极端峰值场景下,就容易成为瓶颈。


三、在秒杀系统中如何应对高并发 WebSocket 连接

✅ 方案一:Tomcat 小规模(≤5000连接)场景可直接使用

适用场景:

  • 只是活动瞬间的短时连接

  • 用户量可控(几千并发);

  • 仅用于实时推送结果(1~2 秒后断开)。

优化建议:

# application.properties 调优参数示例
server.tomcat.max-connections=10000
server.tomcat.accept-count=2000
server.tomcat.threads.max=500
server.tomcat.connection-timeout=20000

这种场景下 WebSocket 可以直接跑在 Spring Boot + Tomcat 上,
例如中小型活动(每次几千人参与)是完全足够的。


✅ 方案二:分离 WebSocket 服务(推荐)

当活动用户量达到数万到百万级,应采用连接与业务分离

架构思路:

      ┌─────────────┐│  前端 (浏览器) │└──────┬────────┘│▼┌──────────────┐│  WebSocket 网关 │ ← 专门维护长连接│ (Netty / Spring WebFlux) │└────────┬────────┘│消息通知通道 (Redis Pub/Sub / MQ)│┌────────▼────────┐│  业务服务 (Spring Boot) │└──────────────────┘

✅ 实现重点:

模块作用说明
WebSocket 网关 管理百万长连接 用 Netty / Gateway NIO 模型
消息总线 转发业务事件 Redis Pub/Sub / Kafka
业务服务 处理下单逻辑 仅做异步下单、状态变化推送

👉 业务服务落单成功 → 通过 Redis 发布 "user_123:success"
WebSocket 网关订阅到后,推送消息到对应连接。

这样:

  • WebSocket 长连接和 HTTP 短请求完全分离;

  • 业务服务不再维护连接状态;

  • 可水平扩展(连接节点 + 业务节点独立伸缩)。


✅ 方案三:短连接优化(Hybrid 模式)

对于“秒杀活动这种瞬时高峰”,可以采用 短连接 + WebSocket 快速推送

  1. 用户点击下单 → 建立 WebSocket;

  2. 等到推送结果(1~2 秒);

  3. 收到后自动关闭连接。

这样同时满足:

  • 实时性;

  • 不会长期占用连接资源;

  • 用户行为天然触发清理。


四、实际项目中的选型建议

并发量级推荐方案技术栈
≤ 1 万 Tomcat + Spring WebSocket 简单稳定
1 万 ~ 10 万 独立 WebSocket 服务(Spring WebFlux / Netty) 分离连接管理
≥ 10 万 IM 级推送平台(Netty + Redis + Kafka) 大规模长连接
秒杀活动短时爆发 Hybrid 模式(短连+推送后断开) 性价比高

五、总结回答两个问题:

Q1:在秒杀高并发下,WebSocket 连接不会太多导致问题吗?

✅ 会有问题,如果直接用 Spring Boot + Tomcat 承载数万连接,会:

  • 消耗大量内存;

  • 消耗内核 fd;

  • Selector 负载高;

  • GC 压力上升。

✅ 解决方式:

  • 采用独立 WebSocket 服务;

  • 或者仅短时保活(Hybrid 模式);

  • 或者通过 Redis Pub/Sub 消息网关分流。


Q2:WebSocket 是否占用 Spring Boot / Tomcat 的 Web 层连接,会影响吞吐吗?

✅ WebSocket 连接建立后不会占用 Tomcat 的 worker 线程,
仍消耗 IO selector 与内存资源
在连接数很大时,会间接拖慢 HTTP 请求处理。

✅ 最佳实践:

  • 业务 HTTP 请求与 WebSocket 服务拆分;

  • 或者使用基于 Reactor Netty / Undertow 的异步容器。


六、一个成熟的“秒杀系统推送层”架构建议(可直接落地)

【推荐架构】┌────────────────────────────┐│        Nginx / Gateway      ││     路由 / 负载均衡层       │└──────────────┬──────────────┘│┌───────┴────────┐│                 │
┌───────────────┐  ┌───────────────┐
│ WebSocket节点A │  │ WebSocket节点B │ ← 使用 Netty
│ 维护长连接池   │  │ 负责推送消息   │
└───────────────┘  └───────────────┘│                 │└──────┬──────────┘▼Redis Pub/Sub or Kafka│▼业务服务节点(Spring Boot)- 下单逻辑- 消息推送通知

这样一来:

  • 业务节点不用维护连接;

  • 推送层可水平扩展;

  • 并发百万也稳定运行。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

团队作业1-团队展示与选题

团队作业1-团队展示与选题团队展示and选题这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23Comput…

websocket是什么以及它要怎么用

WebSocket 实时通知机制。在高并发、异步下单场景中,它是提升用户体验、降低轮询压力的关键组件。 接下来会从原理讲清楚,再结合“秒杀活动”落地展示完整的前后端交互与代码实现(Java Spring Boot + 前端示例)。一…

每日一题:第474场周赛 Q1. 找出缺失的元素

给你一个整数数组 nums ,数组由若干 互不相同 的整数组成。 数组 nums 原本包含了某个范围内的 所有整数 。但现在,其中可能 缺失 部分整数。 该范围内的 最小 整数和 最大 整数仍然存在于 nums 中。 返回一个 有序 …

上一次的参考文献

Charles M, Ochieng S B. Strategic outsourcing and firm performance: a review of literature[J]. International Journal of Social Science and Humanities Research (IJSSHR) ISSN, 2023, 1(1): 20-29. Kocot D,…

思维的漫游者:叙事性所揭示的非目的性心智

思维的漫游者:叙事性所揭示的非目的性心智 我们习惯于将思维描绘成一个猎手:带着明确的问题,在知识的森林中进行“强势搜索”,直至捕获答案。然而,“内观照叙事模型”所揭示的思维图景,更像一个漫游的诗人——它…

C++练习02

//计算复数 #include <iostream> #include <iomanip> using namespace std; typedef struct{float x;float y; }Comp; //打印复数的函数 void Printer(Comp res) {if (res.x == 0 && res.y == 0) …

软件技术基础

项目 内容这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/25rjjc这个作业的目标 实现一个命令行文本计数统计程序姓名 - 学号 周嘉俊 - 2023329301123码云仓库地址 https://gitee.com/rt666666/wc.exe

I2C to 16-Bit GPIO Expander with Interrupt TPT29555A

The TPT29555A is a 16-bit GPIO expander with interruption and weak pull-up resistors for I2C-bus applications. The power supplier voltage range is from 1.65 V to 5.5 V, allowing the TPT29555A to interc…

2025年数据分类分级工具选型指南:智能合规基座与八大产品全景评估

2025年数据分类分级工具选型指南:智能合规基座与八大产品全景评估基于对八款主流产品的深度测试与评估,AI-FOCUS团队研发的成竹AI数据分类分级助手在综合智能化程度、部署灵活性、硬件要求与成本可控性方面表现卓越,…

国产化数据库迁移工具不会用?教你手搓一个万能数据迁移工具。

国产化数据库迁移工具不会用?教你手搓一个万能数据迁移工具。手搓数据库迁移工具需要考虑迁移的数据量、源数据库和目标数据库的类型、版本和兼容性等问题,使用SOD框架可以很方便的解决这些问题。为什么要手搓一个自…

【UE引擎解构】- 引擎基础 :基本组件

前言: UE推崇"组合大于继承"的思路,因此组件在UE中代表功能的具体载体 "UActorComponent 是所有组件的基类。由于组件是渲染网格体和图像、实现碰撞和播放音频的唯一方法,因此玩家游戏期间在场景中看…

思维的“幽灵显影”:神经科学捕捉意义重燃的独特签名

思维的“幽灵显影”:神经科学捕捉意义重燃的独特签名 我们都有过这样的体验:一个被打断的念头,在数小时后悄然复现,并瞬间接续。传统科学将其解释为记忆的简单“提取”。然而,一项基于“内观照叙事模型”的新假说…

搜索百科(6):Meilisearch — Rust 打造的轻量级搜索新锐

《搜索百科》专栏系列,本文主要介绍 Meilisearch,它是一个使用 Rust 语言编写的开源、轻量级搜索引擎,以其极致的性能、简单的部署和友好的开发者体验而闻名。Meilisearch 不基于 Lucene,采用全新的架构设计,特别…

软件工程--团队作业

作业信息:这个作业属于哪个课程 首页 - 计科23级34班 - 广东工业大学 - 班级博客 - 博客园这个作业要求在哪里 团队作业1——团队展示&选题 - 作业 - 计科23级34班 - 班级博客 - 博客园这个作业的目标 组建团队 ; …

C++练习1

#include <stdio.h>struct complex{int real;int imag; };//结构体定义:分为实部和虚部struct complex multiply(struct complex x, struct complex y); //函数声明 int main() {struct complex product, x, y;…

2025.11.2总结

今天继续软考的学习,学设计模式的时候学不动了,稍微记一下三大类,23种,创建型5种,结构型7种,行为型11种。还行 创建型五种,也记住了工厂方法模式,抽象工厂模式,建造者模式,原型,单例模式。概念过了一遍,背…

第二届数证杯初赛-计算机取证

第二届数证杯初赛 容器密码:GQ7aXryvOCM8qGeXa19K9g&jtHSGtrimps@QxaYt4oRwwKHeN0A$#EPv*u 计算机取证分析 请根据计算机检材…

视频瘦身大师

视频瘦身大师 一、作业基本信息 项目名称:视频瘦身大师这个项目属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/作业要求 https://edu.cnblogs.com/campus/gdgy/Class34Grade23Com…

如何把应用程序的图标都摆在xfce的panel上

如何把应用程序的图标都摆在xfce的panel上鼠标右键——面板首选项——项目,可以添加多个启动器。 每个启动器的属性里可以添加多个应用程序。如果应用程序过多(比如3个),就会显示上箭头。

claude_code_clone

claude_code_clone https://github.com/fanqingsong/claude_code_cloneClaude-Code-Clone — LangGraph CLI Coding agentA compact, runnable Python project that reconstructs a demo agent using LangGraph, LangC…