第 22 / 23 篇

附录C:术语与工程检查表

术语 本书中的准确含义
取消 通知执行者工作已无继续价值;需要协作响应,不强杀goroutine
截止 一个绝对时间点;有效截止受父context更早时间限制
资源所有权 对停止使用、关闭和等待最终完成承担责任
接纳 工作进入服务负责的范围;本工程仅内存接纳
排空 不再接纳,让已经承担的工作继续走向终结
强制清理 预算到期后关闭连接、发取消并有限等待合作退出
终结 成功、失败或取消等不再继续的状态,不等于业务成功
背压 下游能力通过等待或拒绝影响上游;仍需限制等待资源
过载 到达需求超过可用处理预算,应该受控拒绝或退化
数据竞争 未建立适当同步的冲突内存访问
逻辑竞态 时序影响业务语义,可能完全没有数据竞争
累计分配 某时间范围产生过的对象字节,包括已回收部分
存活堆 采样所反映仍保留的对象,不等同进程RSS
结果未知 调用失败但无法判断远端副作用是否已发生

代码评审时,优先回答五组问题。第一组是执行:新goroutine由谁取消、谁等待、错误交给谁?第二组是资源:Body、连接、文件、计时器与缓冲区谁拥有,跨函数后责任是否变化?第三组是容量:运行、排队、输入和输出分别在哪里限额?第四组是关闭:接纳与关闭是否原子排序,是否有共享总截止?第五组是证据:测试是否真的触发阻塞并确认恢复,还是仅检查表面状态码?

诊断时先保留版本、配置和现象,再找对应阶段。客户端超时后看服务工作是否退出;CPU低但延迟高时看等待栈;连接等待时看响应体生命周期;部署卡住时看关闭责任与剩余预算。避免在没有证据时同时修改多个限制,否则即使现象消失,也很难知道哪一个动作有效。

扩展时坚持同一原则:新依赖带来新责任,新队列带来新等待,新缓存带来新保留,新协议带来新关闭边界。可靠性来自这些关系保持可解释和可验证,而不是某个库名、语言特性或一次工具通过。