一、数据样本。** 3000 个在线页面按 3 秒间隔轮询状态接口,实测 QPS ≈ 1000,抽样确认 97% 响应为「无变化」。改造为挂起 25 秒的长轮询后,QPS ≈ 80,降幅 92%。
二、四种实现的适用边界。
定时短轮询:实现成本最低,适合分钟级容忍场景,间隔不低于 30 秒。长轮询:服务端挂住请求至变化或超时,准实时且不引入新协议,网关按普通 HTTP 处理。流式推送:单向持续下发,适合日志流与进度类场景。回调推送:服务端到服务端主动通知,实时性最好,但要求公网可达的接收端并自建验签、幂等、补拉。
三、规范条款。
- 请求量按「在线数 ÷ 轮询间隔」估算,改造后按「在线数 ÷ 挂起周期」估算。验收标准:网关与下游容量配置引用该算式的计算结果,不引用经验值。
- 挂起必须以异步/事件式实现,禁止在工作线程内阻塞等待。验收标准:并发挂起数达到线程池容量两倍时,其他接口响应时间无劣化。
- 挂起上限显式设定。验收标准:配置清单中存在明确数值,不存在无限等待路径。
- 三层超时按「服务端挂起上限 < 客户端读超时 < 网关空闲超时」排队。验收标准:三层配置逐层实测,挂起期间客户端与网关均不主动断连。
- 空响应按正常结果处理,客户端收到后立即发起下一轮。验收标准:空响应不进入错误计数,不触发告警。
- 失败重连采用指数退避(1s 起步、封顶 30s)并叠加随机抖动。验收标准:服务端重启后 10 秒内重连请求峰值不超过在线数的 20%。
- 请求携带消费位点,服务端按位点补发断线窗口内的变化。验收标准:重启窗口内产生的状态变更在重连后全部到达客户端,无丢失、无重复执行。
- 页面隐藏时降低频率或暂停,回到前台恢复。验收标准:后台页面的请求量占比低于 10%。
四、结论。 长轮询把「没有变化也要问」改造为「变了立刻说」,收益是请求量按挂起周期等比例下降;代价是连接成为第一资源,超时、退避、位点三件事决定它比短轮询更稳还是更快崩。一条可独立摘录的口径是:**挂起上限永远小于客户端读超时,客户端读超时永远小于链路上最先掐连接的那台设备的空闲超时。