这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《互联网产品的服务端架构·交易、增长与平台化》8.1 实验分流与一致性
推荐实验上线一周,同一用户却在一天内看到新老两版页面,实验组指标被对照组行为稀释。文章解释为什么分流必须是确定性哈希、salt 为什么要按实验隔离、分层实验如何保持正交,并给出 Bucket 与 Assign 的 Go 实现、稳定性与权重测试,以及真实运行输出。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
推荐实验上线一周,同一用户却在一天内看到新老两版页面,实验组指标被对照组行为稀释。文章解释为什么分流必须是确定性哈希、salt 为什么要按实验隔离、分层实验如何保持正交,并给出 Bucket 与 Assign 的 Go 实现、稳定性与权重测试,以及真实运行输出。
活动首周注册转化从 8% 提到 12%,团队当天全量;活动结束第二周,7 日留存从 35% 掉到 22%。文章拆解指标定义、转化率分母、新奇效应与长期留存,给出 Rate 与 Lift 的 Go 实现、对照组零转化的边界测试和真实运行输出,并说明点估计为什么不能替代显著性判断。
注册即发奖的活动在三天内被领空:刷子用接码平台批量注册,每个账号都合规地领一份。文章把发放收成幂等键、用户上限、活动预算三层,说明设备与支付工具维度如何补盲,并给出 Grant 的 Go 实现、拒绝不落账的测试与真实运行输出,以及活动预算为何要单独原子占用。
《群岛纪元》的击杀任务、《泡泡工坊》的点击任务和《裂隙战场》的结算任务,对进度可信度的要求并不相同。本节对比客户端上报与服务端订阅两种模型,讨论事件去重键、任务链前置、门控回填与并发完成幂等,并给出可运行的 questprogress 包与边界。
邀请活动最容易出的问题不是奖励太少,而是关系方向不清:A 邀请 B、B 又邀请 A,发奖任务在环里打转。文章拆解单向绑定、归因窗口、最后点击与深度上限,给出 Bind 与 Attribution 的 Go 实现、环检测测试和一次真实运行输出,并以案例假设值说明预算如何在无人察觉时被循环领走。
风控服务超时两秒,下单接口把所有异常都当成拒绝,用户看到“活动已结束”,库存其实还在。文章说明防刷为什么要同时看账号、设备、IP 和支付工具,风控结果为什么必须区分通过、拒绝和降级,并给出滑动窗口 Check 的 Go 实现、边界测试与真实运行输出。
网关每秒放五千个请求进来,服务内部一次失败重试三次,库存就在重试里被打穿。文章区分令牌桶、滑动窗口、漏桶和并发信号量,说明秒杀链路为什么要短、限流为什么要分层、排队与快速失败如何选择,并给出令牌桶 Allow 的 Go 实现、边界测试与真实运行输出。
十点开场,九点五十九分五十秒才把库存写进缓存,用户已经点进来:库存预热不是把数字抄一遍,而是把读压力提前搬走。文章拆开活动库存与商品库存、分桶预热和单桶容量校验,给出 Validate、State、Preheat 的 Go 实现、边界测试与真实运行输出。
用户只是不想下个月继续扣款,点了取消续费,会员权益却当场消失,剩余十八天也用不了。文章拆解取消、到期、续费失败与退款四种语义,说明续费基准为什么取 max(now, PeriodEnd),并给出 Renew 与 Cancel 的 Go 实现、边界测试与真实运行输出。
退款只退了钱,会员折扣却还在:权益发放和回收如果没有幂等键、原因码和审计,财务、客服与审计都说不清。文章区分发放、到期、回收三种语义,说明退款后如何回收权益,并给出 Active 与 Revoke 的 Go 实现、不可变切片测试与真实运行输出。
会员体系最常见的错误是只存等级、不存成长值:门槛一改,老用户等级全部对不上,回滚也无从判断。文章把成长值、等级和权益拆成三件事,讨论降级策略与规则回放,并给出 LevelOf、AddGrowth 两个纯函数的 Go 实现、边界测试与真实运行输出。
一次预算五十万、计划跑七天的活动在三十小时内被领空:只按账号限领挡不住换设备、换支付工具的刷子。文章拆解总预算、日预算、用户预算三层约束,说明账号、设备、支付工具三维防刷,并给出 Consume 与 Allow 的 Go 实现、边界测试与真实运行输出。
用 arch-lab 订单系统一个上线九个月仍未删除的 checkout-v2 开关开场,区分发布、实验、运维和权限四类开关的生命周期,给出开关求值、过期检测以及缺失责任人、过期时间和清理工单的债务审计 Go 实现,并附 6 个开关样本的真实测试输出。
结算页有三张券却只减了 30 元,用户手动拆单后发现本可以减 40 元。文章说明不可叠加券与可叠加券的规则边界、为什么按面额排序的贪心会选错、金额封顶与百分比向下取整怎么处理,并给出 Best 的 Go 实现、最优解测试与真实运行输出,全程以分为单位。
从一次「限量五千张、三秒发出五千二百张」的领券事故写起,说明券模板与券实例为什么必须分开、发放链路要在哪一层挡住超发、核销为什么要单独做幂等,并给出 Validate 与 Issue 的 Go 实现、边界测试和真实运行输出。所有金额统一用 int64 分表示。
对账时本地少一笔、退款时直接改支付单状态,是财务永远对不平的两个根源。文章以渠道账单为准计算缺失记录,把退款建模为引用原支付流水号单独记账的新资金流,并在提交前校验累计退款不超过原金额,错误信息直接给出超出多少分的差额,同时区分退款与冲正。
回调重试三次导致重复发货,是支付接入最常见的生产事故。文章把验签之后的业务校验拆成渠道流水号、金额和状态三项,用持久化幂等表保证同一个 TradeNo 只产生一次副作用,并说明掉单为什么要靠主动查单补偿而不是被动等待渠道再次通知,最后给出重复回调的测试。
从「每接一个渠道就复制一遍代码」的支付接入写起:支付宝、微信与 Apple Pay 在币种、限额和异步通知上的差异,决定了必须有一张统一支付单。文章给出 Request 校验、币种矩阵与失败场景,并说明为什么只存渠道单号会让换渠道后的对账无法关联。
从“列表里能看到订单、点进详情却 403”的故障切入,说明订单查询的可见性与字段裁剪:本人、管理员、陌生人三种视角各能看什么,列表与详情为什么必须共用同一个 owner 判定。给出 Visible 与 Mask 的 Go 实现与测试,并复盘两个接口各写一套鉴权导致的客诉与数据泄露风险。
用一笔“已付款却被关闭”的订单说明订单状态机与超时关闭:created、paid、fulfilled、closed、refunded 五态和 pay、fulfill、close、refund 四事件如何约束迁移,超时任务为什么要幂等,已支付订单为什么不能被关闭。给出纯函数 Next 的 Go 实现与测试,并复盘关闭任务与支付回调并发导致订单被误关的故障。