建立跨域依赖图并传播约束:入口 QPS 不代表下游负载
入口每秒 2000 内容,平均扇出 3 个模型、20% 重试一次——模型侧期望尝试量是 7,200/秒,数据库至少 14,400 次逻辑写/秒。只拿入口 2000 做所有下游预算,容量结论全错。本页定义依赖图的边标注、预算分配与六条传播链。
依赖图与预算分配
跨域推理可以从一次用户动作开始,沿控制流标出调用,沿数据流标出权威事实和副本,再给每条边加上超时、重试、身份、容量与失败结果。随后标出每个提交点、确认点、缓存或投影的版本、故障域和责任团队。图上未标出的边通常仍存在隐式假设,例如 DNS、密钥服务、发布控制面或告警通道。
对每项质量目标沿依赖图分配预算:请求 deadline 需要扣除排队和重试(推导见延迟预算与尾部放大);一致性要求需要定位可线性化的裁决点;可用性目标要识别共同故障依赖(见故障域、RTORPO 和切换);数据保留需要传播到备份、搜索和遥测副本;安全边界要跟随主体身份经过异步消息。预算无法分配时,通常说明缺少端到端决策者或指标口径。
局部改动的六条传播链
局部变化至少检查六条传播链:负载是否转移到其他层;错误或超时是否改变重试量;数据新鲜度和冲突窗口是否变化;身份与权限是否延伸到新存储;恢复是否需要更多步骤;团队和值班责任是否移动。每条链都要给出可观测信号和失败后的停止条件。
使用影响矩阵能发现未知依赖:行表示变更(引入缓存、切换分区键、跨区同步、异步化),列表示质量目标(延迟、正确性、可用性、安全、成本、组织)。矩阵单元不是打分,而是写明受影响机制、假设和验证方法。无法证明没有影响时,应标为未知并安排证据收集。
架构的跨域正确性不是要求所有组件拥有相同一致性级别,而是要求每个业务不变量在异步边界仍有明确所有者。派生读模型可以短暂陈旧,但扣款裁决必须有单一线性化入口;日志可采样,但审计记录需要满足声明的完整性与保留目标。
从一个用户动作展开需求量
题设每秒2000内容,平均扇出3模型、其中20%需额外重试一次;模型期望尝试量为2000×3×1.2=7200/秒。若数据库每个子任务开始/结束各写一次,至少14400次逻辑写/秒,另有父任务与Outbox;不能只拿入口2000作所有下游预算。
每条依赖边记录放大系数、同步/异步、超时、容量与故障行为。重试若分布在三层,各最多3次,单请求极端尝试可达27,不能把平均失败率乘一次就覆盖最坏风暴。扇出也放大尾部与连接需求,彼此相关失败时简单独立模型不适用。
故障如何反向传播
模型变慢→在途增加→worker占满→队列年龄升→请求超时→客户端重试→新增到达。若再扩worker,数据库回写与模型配额可能先饱和;解决上游等待不等于系统吞吐增加。控制需有总重试预算、并发上限、期限与入口拒绝。
方案A每层独立保护,容易部署但相互配置不一致;方案B在关键工作流传播deadline和业务身份,并建立服务预算契约,协调成本高但更容易解释端到端行为。两者都应保留每层局部容量与故障隔离,不用一项全局开关替所有保护。
验证方法
建立表格:入口速率、每边倍数、服务时间、平均在途、队列上限、持久/非持久、失败后恢复者。把模型耗时由100ms改1s,逐边重算资源;再让某区域失效,检查剩余链路能否持续处理而非只测端口。产物包含正常、慢依赖、网络分区、回填四个场景的传播表与最先触发保护点。用系统容量案例校验算术,所有实测参数另注明版本与窗口。本轮传播表为纸面演算,真实压测未运行。
依赖图边契约与预算表
本页讲了沿依赖图标边,评审时需要每条边五个字段:超时、重试次数、身份(业务键或请求 ID)、容量、失败行为。缺任何一个字段,下游预算就会算错。
用本页算例复核:入口每秒 2,000 个内容,平均扇出 3 个模型、20% 重试一次,期望尝试量 2,000×3×1.2=7,200/秒;数据库每子任务开始与结束各写一次,至少 14,400 次逻辑写/秒,另加父任务与 Outbox。若只拿入口 2,000 做数据库预算,会低估 7 倍以上。
五字段的写法示例:api→model 边超时 500ms、重试 1 次、身份 request_id、容量供应商 2,000 并发、失败进入 UNKNOWN 并查询;worker→db 边超时 50ms、不重试、身份 task_id、容量安全并发 60、失败在幂等检查后重试。没有身份字段的边,重试就无法判断是否重复;没有容量字段的边,扩容时不知道该扩谁。
预算分配要沿边传播:入口 deadline 扣掉排队、网关与返回预留后,剩余时间分给每条串行边;并行边共享窗口,且共享资源(同一连接池、同一 Redis 热键)会破坏独立性假设。重试预算用全局令牌封顶,避免三层各配三次把最坏放大到 27 倍。
执行 python3 labs/architecture_models.py dependency_budget:预期输出 attempts_per_s=7200.0、db_writes_per_s=14400.0,两条边五字段齐全。脚本只做算术与字段检查,不模拟真实调用。
两个合理选择:A 每层独立配置超时与重试,实现简单但放大相乘、deadline 不可解释;B 单一入口传播 deadline 与令牌预算,各层只保留短超时。本例选 B,并要求依赖图的每条边在 PR 中随接口变更一起更新——图过期比没有图更危险。
架构师变化条件
把重试从三层三次改为单层两次加全局令牌:极端尝试从 27 降为 2 与令牌上限的较小者,反向传播链的到达峰值重算。若模型供应商改为按并发计费,成本列加入影响矩阵并改变推荐。新增第四个模型扇出:期望尝试量与数据库写同步放大,先验证配额再上线。每次变化重填传播表并标出最先触发保护点。
闭卷验收
本页 8 道闭卷题收进了下方自测面板:先回忆,再展开参考答案与评分点,最后给三档自评。