《互联网产品的服务端架构·交易、增长与平台化》2.1 下单、支付与履约
从一笔“下单成功、付款却按旧价”的客诉切入,拆解下单时用户、商品、库存、价格快照与风控五道校验的先后顺序,说明支付与履约为什么是两条链路。给出用 int64 分计价、逐项检测乘法和累加溢出的 Go 实现与测试,并复盘价格快照缺失导致的资损与对账差额。
tag
从一笔“下单成功、付款却按旧价”的客诉切入,拆解下单时用户、商品、库存、价格快照与风控五道校验的先后顺序,说明支付与履约为什么是两条链路。给出用 int64 分计价、逐项检测乘法和累加溢出的 Go 实现与测试,并复盘价格快照缺失导致的资损与对账差额。
从「拾光集市」大促后库存快照与流水对不上、对账任务重跑导致同一笔差异被回补两次的事故出发,梳理库存漂移的常见来源,说明为什么对账必须以流水而不是快照为准、回补为什么要用业务唯一键保证幂等,并附可运行的 Go 差异计算与容差判定代码,以及覆盖双向漂移的表驱动测试。
以「拾光集市」限量 200 份手冲套装在大促中支付失败、库存被永久占用的事故为线索,对比下单即扣、支付后扣与预扣确认三种时机的超卖与占用风险,说明可用库存与预留库存为什么要分开、超时释放如何收尾,并给出可运行的 Go 扣减、确认、释放函数与完整生命周期测试。
从「拾光集市」一次上架生成两个 SKU、同一属性组合被卖成两份库存的事故出发,拆解商品、SPU 与 SKU 各自该放什么,说明属性组合为什么要排序、转义并生成稳定 Key,价格为什么必须落在 SKU 上,并附可运行的 Go 校验函数与表驱动测试。
收口卷二:用 Feed 新鲜度、消息到达率与未读准确率三个指标判断内容社交系统是否变好,解释为什么平均延迟不能作为唯一指标,给出 Aggregate 与 Meets 的最近秩 P95 实现、阈值测试、真实输出,并用一段话把读者交接给卷三的交易、增长与平台化。
以多端联调时手机未读归零、平板仍显示 3 的事故写起:说明单测为什么抓不到会话 ID 不一致,如何从用户动作出发用 net/http/httptest 真跑登录、发消息、另一端接收、已读与未读归零,给出 Run 与 RequestStep 的 Go 实现、测试和真实输出。
从「回声」一次发布因通知失败整条回滚的事故写起:拆解发布、Feed 分发、互动与通知四个阶段的同步异步边界和失败语义,给出 Flow、Step 与 Validate 的 Go 实现、表驱动测试与真实运行输出,并整理链路编排的常见错误与边界。
冷启动不是“没有特征就随机”,而是要有明确的兜底链和降级条件,否则新用户会看到空白首页。本文用 Choose 函数实现个性化、热榜、新鲜内容与编辑精选的顺序降级,并给出新用户首页空白的真实失败场景与测试。顺序与健康判定必须可观测、可回放、可演练。
在线推荐最常见的性能事故,是在请求链路里现算长周期特征,p99 会从几十毫秒涨到近一秒。本文拆开离线特征与在线轻量计算,用 Missing 和 L2 归一化守住输入契约,并给出可复现的 Go 测试与 p99 退化案例。在线服务只做查找、拼接与截断。
推荐服务与业务服务的边界一旦模糊,推荐侧就会悄悄依赖内容库表结构,内容团队一次字段迁移就可能让首页空白。本文用候选合并函数说明如何只交换 ID 与分数,把“能不能推”留在业务侧,并给出可运行的 Go 测试与失败场景。边界清晰后,内容下线与运营插位都不必改模型服务。
从作者删帖三天后搜索仍能看到摘要的事故写起,说明删除必须留下墓碑而不能等索引重建。文章用 Lag 与 Stale 判断索引水位是否落后预算,用 Retry 保持失败重试顺序,并给出时间倒退、零预算与墓碑重试的测试、真实运行输出和一致性窗口的产品口径。
从一次搜索结果里出现无权限标题、点进去 403 的事故写起,拆开召回、排序与过滤三个阶段的职责。文章用 Match 纯函数把作者、时间、删除标记与多词命中写成可测试的布尔判断,给出边界用例、真实运行输出,并解释清楚过滤为什么必须发生在排序之前。
从一篇已发布文章在搜索里消失十分钟的事故写起,说明索引是另一种读模型而不是业务库副本。文章比较双写、binlog 与 outbox 三条同步路径,用版本号把重复与乱序收敛进 Apply 纯函数,并给出墓碑规则、边界测试、真实运行输出与可观测水位。
从「回声」APNs 证书过期导致 iOS 推送静默失败三天写起:区分可重试与不可重试的失败,说明重试上限、退避和主备渠道降级为何必须显式建模,给出 Plan、Attempt、Next 的 Go 实现、表驱动测试与真实运行输出,并总结失败降级中的常见错误。
从「回声」用户一天收到 15 条推送后关闭通知写起:拆解按用户、按会话、按内容三种聚合维度,说明营销通知与事务通知为何需要不同频控策略,给出 Template、Render 的 Go 实现、表驱动测试与真实运行输出,并总结聚合去重和频控边界上的常见错误。
从「回声」一条发布成功通知用户却没看到写起:区分发送成功与真实到达,拆解 APNs、FCM、Web Push、小程序订阅消息在包体、图片和深链上的差异,给出 Capability、Of 的 Go 实现、表驱动测试与真实运行输出,并梳理模板裁剪和到达率统计的常见错误。
从「回声」网络抖动触发客户端重发、接收方看到两条相同消息的事故写起:去重不能依赖客户端单方面生成的消息 ID,网关重试和消费重试都会产生重复。文章给出 Window 的 TTL 判定、时钟倒退检测、Prune 清理与幂等边界测试,并说明去重键该由谁生成。
从「回声」手机读完消息、桌面未读数不降的事故写起:已读位置是多端上报的事实,未读数是派生值。文章把按会话已读、多设备取最大已读序号、越界钳零、无记录视为全部未读写成 Count 纯函数,并给出边界测试、真实运行输出与存储、缓存与投递的边界。
从「回声」一次手机和电脑同时在线、消息只到手机的事故写起:在线投递只是尽力而为,多设备投递必须全部覆盖,心跳过期要按离线处理。文章给出 Route 的成员白名单、TTL 边界、去重排序实现与边界测试,并说明离线补偿为什么才是消息可靠性的真正来源。
从换手机拉取三年聊天记录把数据库打满的事故写起,比较按会话分片、按时间分区与按用户分片的代价,说明漫游为什么必须用游标分页,给出保留裁剪 Keep 与 RoamPage 的 Go 实现、边界测试和真实运行输出,并列出消息存储与漫游的常见错误。