《互联网产品的客户端架构·规模化与架构演进》8.1 数据分级与最小权限
数据分级只有落到字段、用途与流向上才可执行。本节把公开、内部、敏感、极敏感四级数据写成可测试的纯函数,演示字段级最大级别、用途绑定、流向上限、保留期审计与最小权限拒绝,并给出可复算的判据与常见反例,说明客户端判定与服务端复核的边界,让「能不能用、给谁用、留多久」在一次判定里同时回答。
tag
数据分级只有落到字段、用途与流向上才可执行。本节把公开、内部、敏感、极敏感四级数据写成可测试的纯函数,演示字段级最大级别、用途绑定、流向上限、保留期审计与最小权限拒绝,并给出可复算的判据与常见反例,说明客户端判定与服务端复核的边界,让「能不能用、给谁用、留多久」在一次判定里同时回答。
一次故障刷出三百条告警,值班同学先花二十分钟分辨哪些是同一件事。本节把告警做成状态机与可计算对象:规则字段、指纹去重、窗口聚合、按具体度路由 owner、runbook 映射与未闭环标记,并用闭环报告把 MTTR、缺失手册与超时告警汇总出来。
日志量一周涨二十倍,账单和合规风险同时到来。本节给出端上采样的三张策略表:按等级采样、按字段脱敏、按等级保留;用确定性哈希保证同一会话的决策稳定,用字节数、放大倍数与单价把成本算成可复核的算式,并说明 PII 脱敏的边界与离线补传的处理规则。
一次支付故障排查花掉三小时,根因不是代码,而是四个团队的上报字段各说各话。本节把日志、指标、追踪收敛成一份可校验的最小契约:三类事件的必填字段、三类错误码、缺失字段报告,以及 span 的父子关联、断链检测与链路深度,并给出契约评审时的判据与反例。
发布流水线的价值不在自动化,而在每一步都能给出可解释的放行或阻断。本节把阶段门禁、灰度比例、健康阈值与回滚触发写成纯函数:前置阶段未通过则后续阻塞,样本不足时保持不动,指标越界立即回滚,并把每次决策追加成可追溯的版本记录。灰度不是按比例放量,而是按证据放量。
缓存命中率低,原因往往不是缓存没有生效,而是缓存键没有覆盖真正的输入。本节把内容哈希、工具链、环境变量与依赖产物拼成稳定缓存键,给出命中、键变化、产物缺失与过期四类判定,并用产物清单与体积预算把构建结果变成可审计的事实。命中率只是结果,可重现才是目标。
Monorepo 的难点不是把代码放进一个仓库,而是让包边界可执行。本节把包声明、依赖、公开与内部可见性、子路径导出写成一张依赖图,用拓扑排序与环检测给出构建顺序,再用纯函数判断跨包引用是否合法,并复盘一次深路径引用绕过评审的事故。边界一旦只写在文档里,就会在第一次赶工期时失效。
演练最容易通过的部分是注入,最容易造假的部分是恢复。若没有恢复断言与未通过项记录,「演练成功」只是一句口号。本节把演练场景、注入步骤、恢复断言与报告判定写成可运行的 TypeScript 模型,并说明 incomplete 与 fail 的区别、中止条件与报告评审判据。
开关越多,事故时越容易互相打架:用户级、实验级、端级与全局规则同时命中时,必须有一个确定的赢家。本节把开关层级、冲突检测、降级动作与兜底内容写成可测试的 TypeScript 模块,并给出优先级判据、常见反例与发布前的审计清单,让每一次关闭都有据可查。
端上故障很少只坏一个按钮:一个共享依赖失效,可能同时带走首页、下单与通知。本节把依赖图、故障域、单点与爆炸半径写成可运行的 TypeScript 模型,用受影响功能比例量化一次故障的波及面,并给出评审判据与常见反例,让「影响面多大」从口头争论变成可计算的数字。
性能优化没有闭环,就等于把成果交给下一次发版碰运气。本节把优化项登记、基线对比、阈值与显著性、回归门禁串成一条可执行的链路,用可运行的 TypeScript 模块判定改进、通过、告警与阻断,说明基线该锁在哪个版本,以及告警如何跟进,让每次发版都有明确结论。
只知道首屏慢没有用,必须回答慢在哪个阶段、哪条路径、哪一行。本节把一次加载拆成网络、解析、渲染、脚本四个阶段,用可运行的 TypeScript 模块计算自耗时、阶段占比、关键路径与可疑阶段,把结论落到具体代码层,避免把并行任务误当成瓶颈,并给出归因时最常见的四类误判。
性能预算不能只有一条全局阈值。本节把启动、首屏、交互、内存四类指标按 Web、iOS、Android、小程序、桌面分别设定软预算与硬上限,用可运行的 TypeScript 模块完成预算表校验、超限明细排序与分端基线对比,并给出预算失效的常见反例。
热更新的难点不是把配置推下去,而是知道什么时候必须停下来。本节从一次凌晨配置推送引发的崩溃出发,给出默认、环境、实验三层配置的覆盖规则,确定性的灰度分桶,以及基于崩溃率、错误率与延迟的批次停止条件,并用可运行的 TypeScript 模块把停止判定写成代码。
插件沙箱的目标不是让插件跑不起来,而是让它在越权时被拒绝、在崩溃时被隔离。本节从一次插件读取全盘文件、拖垮首页的事故出发,给出权限、作用域与配额的三层模型,用可运行的 TypeScript 模块实现最小授权审计、失败隔离与熔断,并说明每个阈值为什么必须按插件配置。
插件化不是把代码拆出去,而是先定义宿主与插件的契约边界。本节从三个宿主版本同时在线、插件清单失控的现场出发,给出插件 id、版本、宿主 API 区间与能力声明的校验模型,用可运行的 TypeScript 模块完成协议校验、兼容判定与责任划分,并说明哪些关注点必须留在宿主。
四个品牌共用一套组件库,一次全量合并后,A 品牌的结算主色出现在 B 品牌的收银台,排查发现是品牌包被当成全局配置加载。多品牌复用的难点不是覆盖,而是边界与隔离。本节用 TypeScript 模块演示覆盖顺序、业务包与品牌包的权限边界、同层冲突检测和复用度计算,并给出多品牌接入前的验收判据。
按钮组件从 1.4 升到 1.5,发布说明写着「只加了可选属性」,四十多个业务包却在编译期报错。问题不在版本号,而在没人把组件契约当成可比较的对象。本节用 TypeScript 模块演示属性、事件、插槽与可访问性语义的变更分类、兼容判定、版本递增和契约快照比较。
同一条按钮 token 在暗色主题下解析成透明文字,往往不是样式写错,而是三层 token 的解析链断了。本节用可运行的 TypeScript 模块演示 primitive、semantic、component 三层解析、主题覆盖优先级、别名环检测与缺失回退,并给出组件库接入主题前的验收判据。
端能力不是布尔值:同一个支付能力可能是原生、polyfill 或完全缺失,同一个功能可能是必需或可选。本节用能力表与降级计划模块,把「原生、polyfill、降级、阻塞」四种策略写成可测试的判定,并说明快照刷新、探测误差、开关实验的边界与排查清单。