《互联网产品的客户端架构·规模化与架构演进》4.1 性能预算与分端指标
性能预算不能只有一条全局阈值。本节把启动、首屏、交互、内存四类指标按 Web、iOS、Android、小程序、桌面分别设定软预算与硬上限,用可运行的 TypeScript 模块完成预算表校验、超限明细排序与分端基线对比,并给出预算失效的常见反例。
tag
性能预算不能只有一条全局阈值。本节把启动、首屏、交互、内存四类指标按 Web、iOS、Android、小程序、桌面分别设定软预算与硬上限,用可运行的 TypeScript 模块完成预算表校验、超限明细排序与分端基线对比,并给出预算失效的常见反例。
「回声」三年规模化计划收尾时,团队发现产品、架构与人并不以同一速度演进:产品按季度变,架构按年变,人的习惯往往要更久。本节用一张对照表梳理三者的节奏与错位,给出把发现按区域汇总并判断是否达标的 Go 实现和测试,并复盘一次路线图只写目标、不写退出条件导致计划空转一年的事故。
「回声」年度架构评审把五个维度的加权分做成了团队排行榜,结果少报维度、只挑高分的团队排到了第一。本节解释权重、缺失维度归一化与 60/80 阈值的设计,给出加权评分与等级映射的 Go 实现和测试,并复盘一次用分数排名替代问题清单、导致安全债被平均掉的评审事故。
「回声」在增长之后同时列出了分片、多地域和服务化三件事,团队却说不清先做哪个。本节把规模化拆成五个不可跳步的阶段,用可验收的退出条件替代目标口号,并给出阶段校验与下一步计算的 Go 实现和测试,复盘一次跳过可观测性直接分片、故障三天无人定位的事故。
热更新的难点不是把配置推下去,而是知道什么时候必须停下来。本节从一次凌晨配置推送引发的崩溃出发,给出默认、环境、实验三层配置的覆盖规则,确定性的灰度分桶,以及基于崩溃率、错误率与延迟的批次停止条件,并用可运行的 TypeScript 模块把停止判定写成代码。
「回声」的主模型超时后自动切到小模型,摘要却变成了复读用户问题。本节把降级看成一条有预算、有质量下限、有风暴保护的链:小模型、规则、模板、排队各自分工,选择顺序由产品写死,并讨论预算、代价与降级风暴的规避,最后用可运行的 TypeScript 实现选链与逐步执行。
「回声」的商品价格缓存双写缺陷在 backlog 里躺了两个季度,每次都被“下个迭代再说”推到后面,最后在大促中变成四十分钟的错价事故。本节用利息、偿还成本与风险给技术债打分,按稳定优先级和团队容量生成演进路线,并复盘清单为什么总是排在最后。
「回声」的支付团队把一个可逆的小改动送进架构评审,排了四天队,最后在凌晨绕过流程上线,反而放大了后续故障。本节按可逆性与影响面给决策分级,把“谁拍板、多久必须拍板”写成可测试的函数,并讨论评审队列为什么会变成新的瓶颈、团队自决又应该留下什么记录。
「回声」把订单域拆成交易与履约两个团队后,一个系统出现了两个 owner,一次字段变更被两边同时执行,定位责任人花了半天。本节把团队与系统的归属关系写成可检测的数据结构,用冲突清单提前暴露多 owner、空边界与命名漂移,并复盘一次重复建设如何演变成两天的对账事故。
大促结束后的复盘如果只写「流量太大」,下一次大促只会重复同一句话。本节把复盘收口为时间线、影响与待办三件事,用 Go 实现事件时间线排序、重复时间校验和待办生成,并复盘一次因为待办只有结论、没有负责人和截止时间,两周后同类故障再次发生的真实案例。
大促预案最容易写成一张只有阈值的表:订单每秒五千、详情每秒两万,却没人回答超限之后用户看到什么。本节把核心接口、限流阈值与降级动作放在一起校验,给出覆盖率计算与 Go 实现,并复盘一次详情接口直接返回 503、导致 App 首页整屏空白的故障。
「回声」大促前一周,业务说峰值是日常的五倍,运维说机器还能再加,压测报告却和线上表现对不上。本节把容量测算拆成业务峰值、安全系数与单实例能力三步,给出可测试的 Plan 函数,并复盘一次因压测请求体、缓存命中率和数据量与线上不同口径,导致开场十分钟即排队的故障。
「回声」做了一次跨机房切换演练,监控全绿,用户却收到重复的离线消息。本节把无感切换拆成排空、补洞、回执三步,给出切换计划校验与完成判定两个函数,复盘一次切换后两端同时补发历史消息造成的重复推送,并给出灰度顺序、回滚条件与切换报告的验收指标。
用户在手机和网页之间切换后,同一段对话出现了重复、空洞和倒序。本节把消息同步拆成序号分配、跨节点去重与补洞三件事,给出 Merge 与 Missing 两个可测试函数,复盘一次按客户端时间戳补拉导致已读消息重复推送的故障,并给出补拉游标的改造清单。
「回声」的 IM 从三台接入机扩到十二台后,老用户频繁掉线,新增节点却几乎空转。本节把会话归属拆成粘性、存活与迁移三条约束,给出确定性路由函数与测试,复盘一次滚动发布把在线连接连续迁移两次的故障,并说明为什么加机器不等于加容量,以及扩容时该怎么选候选节点。
灰度到一半时「回声」发现推荐质量下滑,团队决定回退,却只切了读开关:双写还在继续、缓存没有失效,用户半小时后仍看到新结果。本节把回退条件拆成一致性、延迟、成本、质量与可逆性五类门禁,给出判定函数的实现与测试,并复盘一次门禁名重复、失败项被覆盖的切流事故。
「回声」在切换前让新旧 Feed 链路同时写入,却发现差异看板长期为零:比对只覆盖发布事件,删除与负反馈根本没有双写。本节把双写比对拆成规范化、差异聚合与覆盖率门禁,给出实现与测试,并复盘一次假零差异导致灰度用户继续看到已删内容的切流事故。
「回声」的 Feed 链路在日活八十万后晚高峰频繁抖动,团队却拿不出可复现的基线。本节把延迟、扇出与成本拆成统一口径,给出新旧链路对比函数的实现与测试,并复盘一次只统计成功请求、漏掉超时与跨区流量,导致改造后成本反而翻倍的基线事故与统计陷阱。
内部平台上线半年,180 个服务里只有 12% 迁了过来。本节把迁移成本、双轨成本与退出成本放进同一张账,给出覆盖率与采纳判断的实现和测试,并复盘一次“先上线再推广”如何让平台和业务团队同时被套牢,最后讨论立项时该怎样估算真实收益和回迁代价。
平台组只有 5 个人,却收到从建 Kafka topic 到调 MySQL 参数的各种请求。本节把“平台提供什么、不提供什么”写成带 Owner 与 SLA 的能力清单,给出准入判断的实现与测试,并复盘一次缓存集群没有责任人、故障三小时才找到归属的事故。