卷三讨论的是「钱和库存不能算错」的那部分服务端。前两卷里,「回声」已经能让人发内容、建立关系、实时聊天;这一卷要让它能卖东西、做活动、拉新、对外开放。
交易系统的难点不在接口数量,而在每个数字都要能解释。用户看到的价格、库存、优惠、实付、退款,财务看到的流水、账单、差异,运营看到的 GMV、转化率、预算消耗,必须能互相对上。对不上时,要能回答「差在哪一笔、为什么差、什么时候补」。
本卷要解决的问题
交易与增长链路有四类问题,它们和内容社区的问题形状不同。
- 状态多且相互约束。 订单、支付、退款、履约、券、活动各有状态机,状态之间还有跨对象的约束:未支付的订单不能发货,已退款的订单不能核销券,已关闭的活动不能再领奖。
- 金额要可审计。 每一次金额变化都要有来源、有流水、有对账依据。用浮点存金额、用「改状态」代替退款、用「覆盖」代替冲正,都会在财务对账时暴露。
- 并发集中在少数热点。 秒杀库存、爆款券、热门活动,流量会在一秒内集中到一个 key 上。平时的架构再优雅,热点打不散就是事故。
- 增长动作会反噬系统。 一次全量推送、一次无上限的邀请奖励、一次没有频控的召回,可能带来远超预期的流量,也可能带来刷子。
所以本卷的判断标准是三条:
- 这笔钱/这个库存,现在归谁?变动有没有流水?
- 这个操作重复执行两次,会不会多扣、多发、多退?
- 这个活动放大十倍流量,先坏的是哪一段?有没有兜底?
全书结构:13 章分五段
| 段 | 章节 | 解决的问题 | 收口产物 |
|---|---|---|---|
| 交易基础 | 第 1–3 章 | 卖什么、怎么扣库存、怎么收钱、怎么对账 | SKU 与库存模型、订单状态机、支付回调与对账 |
| 营销与权益 | 第 4–6 章 | 怎么优惠、怎么给权益、怎么做活动 | 券叠加最优解、权益发放回收、秒杀限流 |
| 增长与实验 | 第 7–9 章 | 怎么拉新、怎么验证、怎么触达 | 邀请归因、实验分流与显著性、人群与频控 |
| 平台化 | 第 10–12 章 | 怎么对外开放、怎么跨区域、怎么运营 | 开放平台权限与签名、数据驻留与路由、后台审计 |
| 收口 | 第 13 章 | 把交易链路串起来 | 下单→支付→履约→对账的可运行用例 |
五段之间不是严格串行。第 3 章的支付状态会被第 4 章的券核销、第 13 章的对账反复引用;第 1 章的库存模型会被第 6 章的秒杀复用。可以按段跳读,但段内顺序建议保留。
章节依赖图
第 1 章 商品与库存
├── 第 2 章 订单
│ ├── 第 3 章 支付与对账
│ ├── 第 4 章 优惠券(金额计算)
│ └── 第 13 章 收口
├── 第 6 章 活动与秒杀(库存热点)
└── 第 5 章 会员与权益(价格与权益)
第 7 章 邀请与裂变
└── 第 8 章 实验与配置(度量)
第 9 章 用户触达
第 10 章 开放平台
第 11 章 国际化
第 12 章 运营后台
第 13 章 依赖以上全部
最短路径:
- 下单超卖:第 1 章 → 第 2 章 → 第 6 章。
- 支付掉单、对账差钱:第 3 章 → 第 13 章。
- 券算错、活动预算超支:第 4 章 → 第 6 章。
- 拉新被刷:第 7 章 → 第 9 章。
- 实验结论不可信:第 8 章。
三条阅读路径
路径一:按交易主循环读。 第 1 章 → 第 2 章 → 第 3 章 → 第 4 章 → 第 13 章。回答「一件商品从展示到收款、退款、对账,中间发生了什么」。
路径二:按营销活动读。 第 4 章 → 第 5 章 → 第 6 章 → 第 9 章。回答「一次活动怎么设计库存、预算、权益与触达,才不会超卖或超发」。
路径三:按平台化读。 第 10 章 → 第 11 章 → 第 12 章。回答「对外开放、跨区域部署、运营后台各自的边界与风险」。
贯穿案例:回声的第三阶段
卷二结束时,「回声」是一个有内容、有关系、有 IM 的社区。卷三给它加上交易与增长:
- 用户可以开小店,卖实物或虚拟商品;商品有 SKU、价格、库存。
- 用户可以下单、支付、退款;订单有状态机与超时关闭。
- 平台发券、做满减、做会员、做限时活动。
- 平台做邀请裂变、做 A/B 实验、做召回推送。
- 平台对外开放 API,支持第三方应用接入。
- 业务扩展到多个地区,涉及货币、时区与数据驻留。
这些能力也不是同时上线的。本卷按「先能收钱、再能做营销、再做增长、最后做平台化」的顺序展开,每一章对应一个可以独立交付的阶段。
十三章速览
第 1 章 商品与库存
商品是展示单位,SKU 是交易单位;属性组合要生成稳定 Key;库存分可用与预留,扣减用预扣加确认两段式;对账以流水为准。
产出:SKU 规范化、库存预扣确认释放、库存差异检测。
第 2 章 订单
下单要按固定顺序校验;订单状态机要覆盖支付、履约、关闭、退款;超时关闭与支付回调可能并发,必须幂等;查询接口的可见性与字段裁剪要一致。
产出:订单校验与金额计算、状态迁移、可见性与脱敏。
第 3 章 支付与对账
渠道差异要抽象成统一支付单;回调要验签、验金额、做幂等;掉单靠主动查单补偿;退款是新的资金流,冲正不是改状态。
产出:渠道校验、回调幂等、差异检测与退款校验。
第 4 章 优惠券与满减
模板与实例分离,发放防超发;叠加规则要能求最优解,贪心不一定最优;预算分总预算、日预算、用户预算,防刷要覆盖设备与支付工具。
产出:券模板校验、最优叠加、预算与频控。
第 5 章 会员与权益
成长值与等级分开存;等级规则要可回放;权益发放幂等、回收有审计;订阅是周期权益,取消不等于立即失效。
产出:等级计算、权益有效性、订阅续费。
第 6 章 活动与秒杀
活动库存与商品库存分开;预热把读压力移出峰值;限流要分层;防刷看设备与支付工具;风控失败要有兜底。
产出:活动状态与预热、令牌桶、风控检查。
第 7 章 邀请与裂变
邀请关系单向绑定,不能成环;奖励发放幂等且有上限;增长指标要预先定义,区分转化与留存。
产出:邀请绑定与归因、奖励幂等、转化率与提升度。
第 8 章 实验与配置
分流要稳定、按实验隔离、可正交;显著性不是差异大,要看样本量与最小可检测效应;开关要有 owner、默认值、过期时间。
产出:稳定分桶、双比例检验、开关求值。
第 9 章 用户触达
人群圈选要可解释;触达要分批;归因窗口与最后触点;退订是合规要求,频控要分渠道。
产出:人群筛选、触点归因、退订与频控。
第 10 章 开放平台
应用身份与用户身份分开;scope 最小化;配额按应用与接口;回调要签名、带时间戳、防重放;第三方故障要隔离。
产出:应用授权与配额、HMAC 签名与 nonce、熔断状态机。
第 11 章 国际化
金额存最小单位;时区只影响展示;locale 与 currency 分开;数据驻留是法律约束;就近接入要考虑故障切区与数据延迟。
产出:货币格式化、驻留校验、区域路由。
第 12 章 运营后台
后台权限与用户权限是两套;写操作留审计;运营操作有审批流且执行幂等;报表口径先定义再实现。
产出:权限匹配、操作状态机、报表聚合与差异检查。
第 13 章 收口
把下单、支付、履约、对账串成一条链路;券与活动的端到端验证覆盖库存、预算、退款回补;给出支付成功率、履约时长、对账差异率三条指标。
产出:链路校验、端到端用例、质量指标汇总。
代码分级与本卷落点
| 级别 | 判定 | 本卷落点 |
|---|---|---|
| L1 | 单包、纯逻辑、不依赖外部进程 | 第 1–12 章的全部示例 |
| L2 | 进程内端到端 | 第 13 章的 HTTP 用例 |
| L3 | 真依赖(数据库、缓存、支付沙箱) | 本卷不做,留给卷四 |
| L4 | 多节点、故障注入、网络分区 | 本卷不做 |
代码块开头仍是三行头:
// file: internal/<包名>/<文件>.go
// tier: L1
// verify: go test ./internal/<包名>/
只跑某一章:
go test ./internal/catalog/
go test ./internal/payment/ ./internal/coupon/
数字与版本口径
- Go 1.26.0,module
webapp。 - 金额一律用
int64分,不用浮点;百分比用整数或明确标注精度。 - 文中「实测」输出均在本机真实执行;未执行的写「示例」或「预期」。
- 案例里的订单量、GMV、库存量、券预算是假设值,不是真实业务数据。
- 阈值是起点,换产品要重新标定。
与站内已有内容的关系
站内已有交易、支付、库存、优惠券、增长相关的单篇。本卷不重复它们的定义与清单,只在需要时用一段话交代结论并链接。
本卷新增的是:把交易链路放回「回声」的具体阶段,给出可运行的 Go 实现、失败场景与取舍依据。同一个题目,如果站内文章讲「是什么」,本卷讲「在这个产品里什么时候做、做错会怎样」。
本卷不覆盖的内容
- 不写支付渠道的具体接入文档与签名细节,只写统一支付单、回调语义与对账。
- 不写推荐/搜索算法,这部分在卷二。
- 不写多机房容灾与单元化,这部分在卷四。
- 不写财务系统的完整实现,只写业务侧的对账接口与差异处理。
- 不写法律合规的具体条款,只写数据驻留与退订的工程约束。
术语约定
- SKU:最小库存与交易单位,由商品与属性组合确定。
- 预扣:下单时占用库存,支付确认后转为实扣,失败后释放。
- 统一支付单:业务侧对一次支付的抽象,关联渠道单号。
- 冲正:用一笔反向流水抵消原流水,不是修改原记录。
- 核销:券或权益被使用,状态从可用变为已用。
- 归因:把一次转化归到某个触点上,本卷默认最后触点。
- 分流:把用户稳定地分到实验组或对照组。
- 数据驻留:某类数据必须存放在指定区域。
如何判断自己读懂了
读完一章,回答三个问题:
- 这个状态/金额/库存,谁拥有写权限?变动有没有流水?
- 这个操作重复执行两次,会不会多扣、多发、多退?
- 流量涨十倍,先坏的是哪一段?这一章有没有给出判据?
三题都能用自己的话回答,并能指出代码里对应的函数,就算读懂。
常见误区
- 用浮点存金额。 0.1+0.2 不等于 0.3,退款对账时会出现分差。
- 用改状态代替退款。 支付记录被覆盖后,财务无法还原资金流。
- 把库存扣减放在支付回调里。 下单不占库存,支付时才发现没了。
- 券的叠加用贪心。 先选最大额券,可能让其他券无法使用,总优惠反而更少。
- 邀请奖励按注册发。 刷子批量注册即可套利,成本瞬间失控。
- 实验看到显著就上线。 样本不足、偷看、多重比较都会制造假显著。
- 开关没有过期时间。 临时开关半年后仍在,没人知道它控制什么。
- 报表口径不定义。 两个报表一个含退款一个不含,开会先吵口径。
小结
卷三的主线可以压缩成一句话:每一笔钱和每一个库存变动,都要有来源、有流水、能对账、可重放。
商品与库存决定「能不能卖」;订单与支付决定「钱有没有收到」;券、会员、活动决定「优惠与权益是否算对」;邀请、实验、触达决定「增长动作是否可信」;开放平台、国际化、后台决定「这套能力能否被安全地放大」。第 13 章把这条链路串起来,给出可运行的验证与三条质量指标。
下一步
下一卷进入规模化与架构演进:服务拆分、多活与容灾、单元化、容量与成本治理、平台工程、混沌演练、架构演进路线。那一卷的约束从「一笔交易不能错」变成「一套系统在规模、故障与组织变化下还能持续演进」。
如果你是从卷二读过来的,建议先跑一遍第 13 章的端到端用例,再进入卷四;如果你是带着具体问题跳读的,可以直接从对应章节开始。
带着问题来的读者,可以先看每章末尾的「小结与边界」,再决定要不要回到前面补模型。交易链路的知识密度在后半段更高,但前提是前面的状态与流水已经清楚。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。