一项能力能否长期维护,不取决于演示是否成功,而取决于团队能否解释每个状态、每次重试和每一份残留数据。 浏览器若从同一基础间隔确定性重试,故障越久节拍越整齐。full jitter 在 [0, cap] 随机等待,并在成功稳定一段时间后才重置退避。
实时后端必须在身份、顺序、背压和断线恢复之间给出一致语义。每条消息都要知道属于哪个会话版本、能否重放以及慢消费者达到上限后如何退出。
设计时必须回答的问题
实现之前先列出不可违反的不变量,再为性能与体验留出调节参数。参数可以灰度,身份、权限和终态规则不能在运行时随意漂移。
- 客户端尊重带签名或可信来源的 Retry-After;服务端按区域与主体发放每秒连接令牌,过载时快速拒绝而不完成昂贵鉴权。
- 先定义正常、降级、取消和失败四类终态,再让界面、存储与指标消费同一状态。
- 上线参数必须有保守默认值、服务端上限和灰度开关,不能把浏览器传来的数字直接当作资源预算。
“重连风暴治理:服务恢复时别让所有浏览器同一秒冲回来”的交付标准是正常路径可用、异常路径收敛、资源有界,并且用户能理解系统为何采用当前状态。 这样得到的不是演示代码,而是能解释、能降级、能回滚的生产能力。
边界情况不是附加项
生产问题往往发生在两个正确动作同时到达时。需要逐条检查迟到消息、重复执行、资源耗尽和版本交叉,而不是只补当前堆栈显示的那一行。
- 连接一成功就把退避归零会在抖动故障中形成高频循环;失败请求若完整执行数据库和 TURN 凭据签发会进一步放大负载。
- 旧响应在新任务建立后迟到,如果没有版本隔离,会把健康状态覆盖成失败或再次启动已取消工作。
- 指标标签直接包含用户或任务标识,既制造高基数成本,也让诊断数据泄露不必要的身份信息。
用证据确认它真的可用
发布闸门应包含确定性回归、随机时序探索和真实浏览器组合。发现一次失败后保存 seed 与状态轨迹,让它永久成为可重放用例。
- 模拟十万客户端同时掉线并在服务恢复后重连,观察每秒握手、CPU、数据库查询和达到 95% 恢复所需时间。
- 让刷新、取消、超时和远端完成在同一调度窗口发生,断言系统只产生一个终态和一次副作用。
- 发布前记录成功率、p50/p95/p99 延迟、错误分类和资源高水位,并为回退条件设定明确阈值。
可以上线的标准是:用户知道当前发生了什么,系统在异常后能停止或恢复,资源不会无界增长,运维也能从最小必要证据定位阶段。