第 19 / 22 篇

附录 A:练习解题方向

本附录给出判断依据。涉及实际代码的答案,以该版源码与测试为准;生产系统还需要结合自己的接口、存储和费用合同进行验证。

第 1—4 章:身份、合同与决策

第 1 章至少补充:下游是否已经收到完整事件、具体上游及尝试编号、用量是否可靠且完整。还应关联取消与超时原因。只有一条 timeout 无法区分“未开始”“可能已开始”和“已显示部分结果”。

第 2 章可以展示总量,但不能无依据拆成输入和输出后套用不同费率。估算应保留估算标志与算法版本,正式结算等待足以支持该费率合同的证据,或采用双方明确同意的替代合同。

第 3 章请求同时要求结构化输出和工具调用,候选必须同时满足经验证的能力。未知工具能力不能自动视为支持;应返回可控的 capability_missing 或 capability_unverified 类原因,避免泄露内部端点与凭证。

第 4 章应检查任务质量、流完整结束率、用量完整率、尾延迟与预算占用。用量缺失会影响成本控制和对账,通常不宜仅因平均延迟变好就扩大流量。回退条件可以写成在固定窗口和足够样本下,完整结束率低于已确定门槛;门槛应来自自身业务要求,不能照抄一个通用百分比。

第 5—9 章:流与资源

第 5 章的所有切分位置都应还原相同的中文文本与同一条事件,且不出现替换字符。英文测试无法覆盖多字节 UTF-8 序列被切开的情况。还应测试分隔空行被拆开、CRLF 被拆开和最后没有事件终止空行。

第 6 章可以在一个受锁保护的终态转换中决定取消与完成谁先被接受。若完整且验证通过的结束已先提交,后来的取消不应再次释放;若取消先被接受,后到的数据不能绕过状态机二次结算。具体采用什么优先级应写入合同,关键是终态与资源处理只发生一次。

第 7 章在最简单的独立上限模型里,次数可能达到 2 × 3 × 2 = 12。它仍未说明每次尝试是否被接受、是否去重、是否有工具副作用,以及成本如何产生;还需要各层尝试记录和业务证据。

第 8 章本地工作已经结束后,并发槽位可以释放;未知用量预留继续保留,直至可信核查或明确风险政策处理。并发限制控制活跃本地工作,预算控制尚未解除的资源承诺,两者不必具有相同生命周期。

第 9 章可用额度为 100 − 20 − 30 − 15 = 35。删除未知预留会让显示值增加 15,但这项增加并没有来自新用量证据;若有意采取该政策,需要留下审批与风险记录。

安全、观测与验证

安全练习应首先识别身份边界、上游信任边界和工具执行边界。内容中出现的权限声明与 usage 片段都只是数据,不能覆盖认证结果和账本。出口地址、密钥来源与私有未开始信号需要由受控配置决定。

观测练习要分别统计入口请求和上游尝试,并明确哪些拒绝进入哪个分母。流已返回 HTTP 200 但未完整结束时,应进入中断分类;未知用量不是零用量。若要求延迟数据,计时起点和终点也必须随报告说明。

第 12 章可以让首个替身先输出一段文本,再主动断开;后备替身保持可用。客户端必须观察到部分内容与失败,后备接收次数为零,账本记录未知用量并保留预留。任何一个条件缺失,都不足以证明“未静默重放”。

实验章与综合设计

实验结果需要同时核对客户端事件、替身计数和账本状态。改变输出上限、租户额度和故障模式时,应先算出新的预留或预期状态,再运行测试。运行失败要保留异常和环境信息,不能只修改预期值让测试通过。

生产设计练习的重点是重启与多实例:内存锁、内存记录和本地取消状态的保证都限制在进程内部。引入持久存储后,应验证重复完成、重启后未知任务与并发争用,而不只跑原来的单进程成功测试。

第 17 章的一页设计应包含支持的协议与能力、租户认证、上游范围、尝试规则、期限、预算单位、终态、恢复与发布方式。未实现项可以成为清晰的下一步,例如“增加持久化未知用量对账,并以进程重启和重复结算测试作为验收”,比泛称“以后支持高可用”更容易执行。