一项能力能否长期维护,不取决于演示是否成功,而取决于团队能否解释每个状态、每次重试和每一份残留数据。 sender 的 send() 只进入缓冲,真正用户进度更接近 receiver 已校验并持久的连续字节。最终 100% 还需总哈希和原子完成。
产品闭环要覆盖开始、等待、取消、失败、恢复与再次进入,并保证自动化服从用户最后一次明确选择。指标应衡量任务结果,而不是按钮点击数量。
设计时必须回答的问题
实现之前先列出不可违反的不变量,再为性能与体验留出调节参数。参数可以灰度,身份、权限和终态规则不能在运行时随意漂移。
- 主百分比使用 confirmedBytes/total,次级状态显示正在准备、传输、校验或保存;补发不增加唯一确认字节,ETA 在样本不足时隐藏。
- 把协议事实、用户意图和自动恢复分层;自动化只能恢复事实,不能推翻用户明确选择。
- 上线参数必须有保守默认值、服务端上限和灰度开关,不能把浏览器传来的数字直接当作资源预算。
“文件进度条到底表示什么:已读取、已发送、已确认还是已落盘”的交付标准是正常路径可用、异常路径收敛、资源有界,并且用户能理解系统为何采用当前状态。 这样得到的不是演示代码,而是能解释、能降级、能回滚的生产能力。
边界情况不是附加项
不要把异常路径理解成弹一次提示。它还包括在途工作如何停、对端如何获知、残留数据如何处置,以及下一次操作是否会继承旧状态。
- 按 bytesSent 计算会在重传时超过 100%;文件全部到达后长时间哈希却显示完成会让用户关闭页面并丢结果。
- 旧响应在新任务建立后迟到,如果没有版本隔离,会把健康状态覆盖成失败或再次启动已取消工作。
- 没有背压或配额时,慢消费者会把内存、队列长度与尾延迟一起推高,最后拖累无关用户。
用证据确认它真的可用
测试不能以“最后成功了”结束。还要测量经历了多少次副作用、等待多久、是否泄露内容,以及失败后再次执行能否从干净基线开始。
- 覆盖正常、暂停、重复块、补洞、刷新恢复、校验失败与磁盘慢,断言百分比单调、终态准确且双方字节能对账。
- 让刷新、取消、超时和远端完成在同一调度窗口发生,断言系统只产生一个终态和一次副作用。
- 发布前记录成功率、p50/p95/p99 延迟、错误分类和资源高水位,并为回退条件设定明确阈值。
最终结果应同时满足正确性、可恢复性和可解释性。任何一项只能依赖刷新页面或工程师猜测,都说明协议闭环仍不完整。