这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《后端架构设计·演进与治理》8.3 从演练到修复:游戏日、回归与证据留存
把一次游戏日从“跑完四个实验”变成可复核的治理闭环:用严重级别、责任人与到期日约束 Finding,要求 P1/P2 绑定修复前失败、修复后通过的回归用例,并用 SHA-256 封存证据链,给出结构化审计与内容校验的 Go 实现及变异测试。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
把一次游戏日从“跑完四个实验”变成可复核的治理闭环:用严重级别、责任人与到期日约束 Finding,要求 P1/P2 绑定修复前失败、修复后通过的回归用例,并用 SHA-256 封存证据链,给出结构化审计与内容校验的 Go 实现及变异测试。
触控仲裁不是命中测试,而是按时间、位移与手指数决定这一下算点击、滑动、长按还是多指。本节给出四类手势的阈值状态机,把弹窗遮罩、UI 与玩法输入的优先级写进同一套输入门,并说明边缘防误触与连点冷却如何用可回归测试锁住,避免一次手势被投递两遍。
缓存命中率低,原因往往不是缓存没有生效,而是缓存键没有覆盖真正的输入。本节把内容哈希、工具链、环境变量与依赖产物拼成稳定缓存键,给出命中、键变化、产物缺失与过期四类判定,并用产物清单与体积预算把构建结果变成可审计的事实。命中率只是结果,可重现才是目标。
《泡泡工坊》上线首日,支付渠道重复回调让同一笔 6 元订单发了两次货,客服只能按截图手工补单。本节拆解下单、回调、验签、发货与通知的状态机,比较同步发货和先记账后异步发货,说明订单号与渠道单号的绑定、事件去重与发货重试的边界,并给出可运行的 Go 回调处理与幂等发货片段。
一次输出拦截没有申诉入口,让「回声」的内容安全接入暴露出规则与流程的双重缺口。本篇给出规则加分类器的双层审查、拦截与降级、只存哈希的审计记录与带时限的申诉状态机,用可运行的 TypeScript 测试固定决策顺序、降级行为与已知边界,并说明申诉推翻后为什么不能自动放行原文。
把一次“指标看起来还行”的失败演练拆成可证伪的稳态假设:区分业务主张与护栏信号,用连续越界窗口和最小样本数抑制噪声,再给出独立于实验结论的止损决策 Go 实现与固定时钟测试,并解释为什么止损路径必须 fail closed 而不能只靠人工盯盘。
Monorepo 的难点不是把代码放进一个仓库,而是让包边界可执行。本节把包声明、依赖、公开与内部可见性、子路径导出写成一张依赖图,用拓扑排序与环检测给出构建顺序,再用纯函数判断跨包引用是否合法,并复盘一次深路径引用绕过评审的事故。边界一旦只写在文档里,就会在第一次赶工期时失效。
一键领取看似只是循环调用单封领取,真正的问题是部分成功如何表达、失败要不要回滚、补偿怎样避免重复,以及红点计数怎样和邮件列表保持一致。《裂隙战场》的赛季结算、《群岛纪元》的全服补偿、《泡泡工坊》的日常奖励,都需要同一套批量语义。本节给出批量领取结果模型、补偿幂等键与审计日志,以及由同一份列表派生的红点聚合。
刘海屏毁掉的第一版 HUD,往往不是按钮太小,而是顶部状态栏压住了暂停键。本节把逻辑分辨率、cover 缩放、安全区映射与九宫格锚点写成无头布局模型,用四种屏幕形状验证矩形不越界、触控目标不低于 44pt,并明确它只是布局计算,不是渲染验证。
演练最容易通过的部分是注入,最容易造假的部分是恢复。若没有恢复断言与未通过项记录,「演练成功」只是一句口号。本节把演练场景、注入步骤、恢复断言与报告判定写成可运行的 TypeScript 模型,并说明 incomplete 与 fail 的区别、中止条件与报告评审判据。
用户在评论里写下「忽略前面的指令」,检索文档里又藏着角色伪造。「回声」的这次事故说明,提示注入不是句子黑名单问题,而是信任边界问题。本篇把系统指令、用户内容、检索内容与工具输出分成四层,给出可断言的信号评分、隔离策略和工具参数二次校验,并说明为什么正则只能是信号而不能是唯一防线。
从 arch-lab 订单系统一次按实例比例审批、却在网络层故障中放大到全链路的事故切入,区分进程、网络、依赖与区域四层注入各能证明什么,给出按拓扑计算真实爆炸半径、检查关键状态转换损失并在超预算时拒绝执行的 Go 实现与表驱动测试,全部代码在本机跑通。
邮件正文可以永久可读,附件却是有归属、有期限的资产。《裂隙战场》的赛季奖励、《群岛纪元》的联盟补给、《泡泡工坊》的限时礼包,都要回答领取是否原子、过期后归谁、背包满时怎么办。本节给出附件状态机、过期扫描与宽限期、三种结算策略,并附可运行的领取幂等与流拍结算代码。
开关越多,事故时越容易互相打架:用户级、实验级、端级与全局规则同时命中时,必须有一个确定的赢家。本节把开关层级、冲突检测、降级动作与兜底内容写成可测试的 TypeScript 模块,并给出优先级判据、常见反例与发布前的审计清单,让每一次关闭都有据可查。
支付回调超时后,Cancel 可能先于 Try 到达,造成空回滚;迟到的 Try 又可能永久占住库存,形成悬挂。本文用订单预占场景实现带墓碑与状态机的 TCC,并用同库本地消息表让 TRYING、CONFIRMED、CANCELLED 对下游可见,给出空回滚、悬挂、幂等与中间态查询的可运行测试。
订单 Saga 失败时,“把前面的步骤反向调用一遍”看似简单,实际补偿是新业务动作,可能失败、可能不幂等,也挡不住并发请求读到中间态。本文用库存预留、支付扣款与发券场景,给出带语义锁、逆序补偿和不可补偿步骤校验的可运行 Go 实现,并列出把不可逆动作前移或改为可重试的判据。
订单与库存、支付分库后,两阶段提交常被当成“分布式事务的标准答案”。本文用一次下单说明它真正保证的是原子提交而不是不阻塞,给出参与者日志、协调者决策日志与崩溃恢复的可运行 Go 实现,复现 in-doubt 窗口,并用判据表比较 2PC、3PC 与补偿型方案。
端上故障很少只坏一个按钮:一个共享依赖失效,可能同时带走首页、下单与通知。本节把依赖图、故障域、单点与爆炸半径写成可运行的 TypeScript 模型,用受影响功能比例量化一次故障的波及面,并给出评审判据与常见反例,让「影响面多大」从口头争论变成可计算的数字。
从「回声」把合作方租户私信送进主站模型的事故出发,拆解密钥分级与轮换、租户隔离、出域字段白名单和区域路由四道边界,给出可运行的 TypeScript 实现与 11 条测试,说明每次放行为什么都要留下可追溯的决策记录,再复盘一次跨租户调用为什么会同时穿过四道默认值。
返回键不是「关闭当前界面」,而是从最上层消费一次导航意图。本节用页面栈、互斥弹窗队列、优先级、去重与抢占规则,解释 Android 返回键和 iOS 侧滑为何必须归一化成不同结果,并给出连点节流与 Toast 冷却的可运行模型,让误退出和重复弹窗变成可回归的断言。