实时应用程序的 WebSocket 主机托管要求
WebSocket 应用程序会保持连接,让服务器与客户端可以双向交换数据,而不用为每条消息重新建立请求。这种方式适合聊天、协作工具、实时仪表板、多人游戏、交易界面以及其他实时产品,但也改变了主机托管的要求:平台要同时处理大量长连接、稳定网络路径、可预测的进程容量以及有序的故障处理。
WebSocket 主机托管需要维持哪些能力
WebSocket 连接开始时会使用 HTTP 升级握手,但握手完成后的工作负载与普通网页托管不同。一条连接可能维持数分钟甚至数小时,由任何一方接收消息,即使暂时没有业务数据,也可能需要通过心跳维持连接。主机、操作系统、反向代理、防火墙和应用程序进程都要允许连接保持正常。
合适的 WebSocket 托管环境应该正确传递升级标头,支持长时间 TCP 连接,为预期的 Socket 数量提供足够文件描述符,并让应用程序在维护期间有序清空连接。服务器还需要足够内存保存连接状态,以及足够 CPU 处理消息高峰、加密、序列化、身份验证和广播分发。
- 在网络边缘支持 WebSocket 和安全 WebSocket
- 反向代理正确传递 HTTP Upgrade 和 Connection 标头
- 足够的文件描述符、队列和并发连接容量
- 配合应用程序的心跳和空闲超时设置
- 进程监控以及有序清空连接的能力
按并发连接数和消息高峰规划容量
每日活跃用户数不足以用来规划 WebSocket 服务器。更实用的起点是高峰并发连接数,再加上每秒消息数、平均及最大消息大小、广播分发数量,以及每个客户端需要保存的状态。即使用户数量不算多,只要大量用户长时间保持连接,或一个事件需要同时发送给数千个客户端,仍然可能需要相当的容量。
硬件配置应该配合工作负载,而不只是比较单一规格。Dataplugs 的 Kubernetes 独立服务器型号指南 从 CPU 拓扑、内存余量、NVMe 存储以及网络一致性等角度,说明如何为分布式工作负载选择基础设施。当 WebSocket 服务部署在多个应用程序或节点上时,同样的原则也适用。
- 高峰及持续并发连接数
- 每秒消息数以及预期最大消息大小
- 广播分发数量和重新连接高峰
- 会话、订阅和队列所使用的内存
- 上行及下行网络流量
Tip: 应该以最大实际连接数和消息高峰进行测试。平均流量下表现稳定的服务器,在网络事件后客户端同时重新连接时,仍然可能失效。
设置反向代理和负载均衡
Nginx、HAProxy、云端负载均衡器及其他代理可以终止 TLS 或转发 WebSocket 流量,但它们的默认值通常是为短时间 HTTP 请求设计的。应该检查连接、读取、发送以及空闲超时,并确保代理在不缓冲或错误关闭正常连接的情况下传递升级握手。心跳间隔应该短于所有相关空闲超时。
当服务扩展到多个节点时,网关、应用程序服务器、数据库以及消息系统之间的内部流量也要纳入设计。Dataplugs 的文章 多服务器架构中的东西向流量 解释了横向通信为什么可能成为延迟、拥塞和扩展压力的隐藏来源。选择负载均衡布局前,应该先整理这些流量路径。
- TLS 在负载均衡器还是应用程序终止
- 空闲、读取、发送和上游连接超时
- 粘性会话,或外部共享会话及订阅存储
- 测试 WebSocket 就绪状态,而不只是 HTTP 状态的健康检查
保护 WSS 并管理连接状态
正式环境的 WebSocket 流量通常应该使用 443 端口上的 WSS,让连接在传输过程中加密,也能通过常见网络控制。应该先决定证书在哪里终止、如何更新证书,以及应用程序如何在允许订阅或发送消息前验证用户身份。TLS 会让握手消耗额外 CPU,因此容量测试也应加入大量重新连接的情况。
WebSocket 连接即使在普通 HTTP 请求之间保持无状态,仍然属于有状态连接。如果客户端可以连接到任何后端节点,订阅状态、在线数据、消息顺序以及授权变更就必须共享,或以一致的方式路由。可以使用 Redis、消息代理、数据库状态或经过设计的会话粘性,但每个选择都会带来自身的可用性和恢复要求。
- 证书更新及到期监测
- 订阅或广播前的身份验证和授权
- 多节点部署所需的共享状态或路由
- 消息大小、订阅数量以及发布速率限制
规划操作系统、内核和进程限制
不少 WebSocket 故障其实由应用层以下的限制造成。应该检查进程的文件描述符限制、监听队列、TCP keepalive 行为、临时端口使用量、连接跟踪、反向代理工作进程容量,以及容器或 systemd 限制。提高限制时应该逐项验证,确保内核、代理、应用程序运行环境和监测系统都能承受新的上限。
- 文件描述符及最大打开 Socket 数量
- TCP keepalive、连接跟踪及空闲清理
- 监听队列及接收队列行为
- CPU 调度、内存限制及垃圾回收停顿
Tip: 应该把每项限制纳入容量模型并测试。提高 Socket 上限并不会自动增加内存、带宽或应用程序数量。
在应用层监测连接健康
普通 HTTP 平均响应时间不足以描述 WebSocket 健康状况。应该监测现有连接数、成功和失败握手、连接持续时间、关闭代码、心跳丢失、重新连接率、每秒消息数、队列深度、发送缓冲区增长以及重要事件的延迟。这些指标有助于区分慢速客户端、应用程序过载、代理超时和网络路径故障。
当连接技术上仍然打开,但用户体验已经下降时,Layer 7 可视性尤其有用。Dataplugs 的 Layer 7 应用程序监测 文章说明协议层指标如何揭示端点行为、延迟百分位、错误模式以及应用层异常。WebSocket 服务也应该对实时事件、订阅频道和重新连接活动采用相同的监测方法。
- 连接及握手成功率
- 消息或事件传送延迟的 p95 和 p99
- 异常关闭代码和重新连接风暴
- 各频道队列深度和慢速客户端数量
更新部署时避免大量重新连接
普通进程重启可能会同时中断某个节点上的所有客户端。应该采用有序关闭:停止接收新连接、在负载均衡器标记实例不可用、在适当时通知客户端、保留排空时间,再以清晰原因关闭剩余 Socket。滚动部署也应该预留足够容量,让新旧进程可以短暂重叠。
- 在终止进程前排空连接
- 客户端重新连接采用退避和随机延迟
- 保护身份验证和订阅服务免受重新连接高峰影响
- 测试部署、回滚和证书轮换行为
为故障和恢复预留方案
单一独立服务器可以让 WebSocket 运行更简单,但也会形成单一故障范围。更高可用性通常需要多个应用程序节点、可靠的负载均衡层、共享或可重播的消息状态、位于受影响节点以外的监测,以及文件化的恢复流程。客户端应该设计成可以重新连接和重新同步,而不是假设一条 TCP 连接会永久保持。
应该通过速率限制、身份验证控制、消息大小限制,以及合适的 DDoS 或防火墙保护,减少流量高峰和滥用连接模式的影响。部署配置、证书、路由规则,以及重建订阅或在线状态所需的数据,都应该妥善备份。服务器恢复并不代表复原完成,因为客户端仍可能无法重新建立有效会话。
独立服务器还是共享虚拟容量
独立基础设施可以为长连接提供更可预测的 CPU、内存、网络和文件描述符余量,也能减少邻居工作负载造成的不确定性。不过,它不能取代应用层扩展、负载均衡、监测和恢复规划。选择托管模式时,应该根据并发连接模式、运营能力、地理位置要求和中断成本判断,而不是只比较处理器核心数量。
结论
WebSocket 托管不只是提供一部能够传送普通网页的服务器。设计应该同时考虑长连接、高峰并发连接数、消息高峰、代理超时、WSS、共享状态、操作系统限制、Layer 7 监测、有序部署和恢复。把这些要求一起衡量后,基础设施团队便可以选择合适的服务器配置及网络架构,让实时应用程序在使用量增加时仍然保持响应稳定。
如果实时工作负载需要可预测的单一租户容量,Dataplugs 提供具备可配置硬件、网络选项和技术支持的 独立服务器 方案,支持正式环境部署。
如需更多资料,请浏览 Dataplugs 或联系 sales@dataplugs.com。
