服务器容量

更新于 2026-05-30 · 在 6.61–6.64 修复上线之后。

要点:处于预生产阶段,没有历史包袱

生产服务器上还没有真实用户。 所有安装都是测试性的。由此:

按负载区间的估算

用户规模,MAU并发 WS(峰值)单台 VPS 的状态主要瓶颈
≤ 30k ≤ 3k 十倍余量,闲置 我们的技术栈里没有
30k — 100k 3k — 10k 目标区间,从容 Workerman 的 CPU 轻松应付 pong 与事件。数据库走主键查询。套接字占用 500 MB–1 GB 内存。
100k — 200k 10k — 20k 处在极限运行 单个 Workerman 进程在峰值时过热。一旦冒出 WebSocket 掉线的缺陷,性能就开始劣化。
> 200k > 20k 触到天花板 需要进入 C 阶段(Workerman count=4,加上用于共享 $hosts/$guests).

6.61–6.64 修了什么

Metric修复之前6.64 之后改在哪里
ble_token_renew 主人离线期间排队 4 小时 1300 次 1(靠 UNIQUE INDEX 去重) Server ——对任何客户端都有效
网络故障时的 HTTP 重试 5 个密钥 × 每分钟 1 次 = 每天 7200 次 每天约 50 次(30 分钟退避) 客户端 6.64 ——需要新的 APK
网络抖动时的 WebSocket 重连 每分钟约 10 次(1 秒重试) 每分钟约 1 次(60 秒退避) 客户端 6.62+ ——需要新的 APK
WebSocket 抖动期间 hello 的数据库查询 1 万客户端下每秒约 50 次 ~5/s Server ——5 秒的频率限制可防住任何客户端
访客本地设置中的失败 fire 事件 每位持过期令牌的访客每天 60 次以上 0 客户端 6.63
guest_ok 引发的重组浪潮 每次 numbers_update 都触发 仅在真正变化时 客户端 6.64

对所有客户端立即生效的部分(服务端修复)

服务端的防护位于对入站消息的处理之中 ——与客户端版本无关。

只有客户端更新后才生效的部分

决定:提高 $MIN = '6.66'。任何旧客户端在第一次 versionCheck 时收到阻断式的“请更新应用”对话框(界面已经存在,见 App.kt:checkVersionAsync).

横向扩展 Workerman——何时才有必要

就目前而言 count=1 ——单个 PHP 进程把全部 WebSocket 都放在数组里 $hosts/$guests/$calls in-memory.

具体阈值:

接近 1.5 万时该做什么:

  1. 在 VPS 上装 Redis(apt install redis-server).
  2. Workerman count=4 (与 VPS 核心数一致)。
  3. Move $hosts/$guests/$calls 放进带 TTL 的 Redis HASH。
  4. 工作进程间的 pub/sub:消息落到 W1 而收件人在 W2 时,通过频道转发。

Effect: 线性扩展至 4 倍,天花板抬到大约 4 万–6 万并发。

迁移到 CDN——何时才有必要

目前 22 MB 的 APK 由我们自己的 VPS 分发给每一位用户。到十万量级,每次发布就是 2.2 TB 出网流量——自家线路可能撑不住,或者代价高昂。

6.64 中已铺好的准备:

当确有必要迁移时:

  1. 建 Cloudflare R2 存储桶 → 上传 entrixy.apk.
  2. 自定义域名 apk.entrixy.com ,走 Cloudflare CDN。
  3. In _config.php: $GLOBALS['apk_url'] = 'https://apk.entrixy.com/entrixy.apk';
  4. 在部署脚本里,于 assembleRelease add r2 cp app-release.apk apk-bucket/entrixy.apk.

以当前规模——几十个测试安装——无需迁移。

行动清单:服务器和应用里现在有什么

要让全部修复生效:
  1. 在服务器上: sudo supervisorctl restart dialer-ws.
  2. 任何低于 6.66 的版本在下次启动时都会收到强制更新对话框。
  3. 6.66 上线之后,重连风暴与重试带来的负载下降一个数量级。