讲师中心 微信公众号
AI工具推荐 视频效率加速

Workerman如何应对网络闪断带来的海量客户端同时重连雪崩?

千宇同学_5012

千宇同学_5012

发布时间:2026-05-21 22:50:36

|

736人浏览过

|

来源于php中文网

原创

Workerman雪崩源于连接初始化位置错误及缺乏协同防护,须将Redis等连接移至onWorkerStart、客户端实施指数退避、服务端限流+连接池隔离,并强化心跳时效性检测。

workerman如何应对网络闪断带来的海量客户端同时重连雪崩?

Workerman 无法靠单点心跳或重连逻辑扛住雪崩式重连,必须结合客户端退避、服务端限流与连接池隔离三者协同防御。

为什么 onConnect 里直接 new Redis() 会雪崩失败?

客户端网络闪断后集体重试,所有 Worker 进程几乎同时在 onConnect 或业务入口中新建 Redis 连接。这时会出现:多个进程争抢有限的 Redis 连接数、TCP TIME_WAIT 耗尽本地端口、Redis 服务器因瞬时连接激增拒绝新连接(报错 ERR max number of clients reached)。

根本原因不是 Workerman 框架问题,而是把“连接初始化”错误地放在了请求入口路径上——它本该是进程级预热动作,却被当成了每次连接都要执行的操作。

  • 必须把 Redis/MySQL 等连接全部移入 onWorkerStart,每个 Worker 进程只建一次连接
  • 连接对象要绑定到 Worker 进程全局变量(如 $GLOBALS['redis']),而非 $connection 属性或局部变量
  • 禁止在 onMessage 或 onConnect 中调用 new Redis()、new PDO() 等构造函数

如何让客户端重连不扎堆?

客户端自身不做退避,服务端再强也扛不住。前端、App、IoT 设备都必须实现指数退避(exponential backoff),比如:第一次断开后等 1s 重连,失败则等 2s、4s、8s… 最大不超过 60s,并加入随机抖动(±30%)。

若你控制不了客户端(如第三方硬件设备),就得在网关层做兜底:

  • 用 Nginx 在 upstream 前加 limit_conn 和 limit_req,按 IP 或 token 限频
  • 在 GatewayWorker 的 onConnect 中检查客户端 IP 的 5 秒内连接次数,超阈值直接 $connection->close()
  • 对高频重连 IP 记录到 Redis,后续连接直接拒绝或降级为 HTTP 短轮询

连接池不是可选插件,而是雪崩防护刚需

单个 Worker 进程复用一个 Redis 连接,在高并发下会成为瓶颈(串行等待),且一个连接异常会导致整个 Worker 后续所有请求失败。连接池能解耦“连接获取”和“业务处理”,提供熔断、超时、最大空闲数等关键能力。

推荐方案:

  • PHP 侧用 co\Pool(Swoole 协程池)或 spiral/roadrunner 配合 Workerman 做进程外连接管理
  • 更轻量的选择是 phpredis + 自研简易池:预创建 N 个 Redis 实例存入数组,用 spl_queue 管理可用连接,获取时 pop,归还时 push
  • 务必设置 timeout 和 read_write_timeout,避免某个慢查询拖垮整个池

心跳检测不能只发 ping,还要验响应时效

很多项目只在 onWorkerStart 启动一个定时器,每 30 秒向所有连接发 ping,但没检查对方是否真的回了 pong 或响应是否超时。这会让“假死连接”长期滞留,占用资源,等雪崩来临时反而加剧压力。

正确做法:

  • 给每个 $connection 绑定 last_pong_time 时间戳,收到 pong 就刷新
  • 心跳定时器中遍历连接,对 time() - $connection->last_pong_time > 90 的连接主动 close
  • 客户端发 ping 后,服务端不立即回 pong,而是记录 ping_received_at;客户端超时未收到 pong 就主动断连重试

真正危险的从来不是连接断开本身,而是大量“半死不活”的连接卡在中间,既不通信也不释放——它们会在雪崩临界点前悄悄吃掉最后一丝资源余量。

热门AI工具

更多
小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

11604

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6681

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2175

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

4248

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4954

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3891

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5617

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4402

2023.11.13

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn