一、为什么电商案例特别适合学架构
电商不是因为“常见”才值得讲,而是因为它几乎包含了架构设计里最典型的矛盾:高并发、复杂状态、一致性、异步流程、热点数据、失败补偿、业务快速迭代。把电商系统看明白,很多业务系统的设计思路都会豁然开朗。
二、先不要急着拆服务,先把核心流程画出来
一个完整下单链路通常至少包括:
- 用户确认商品和地址。
- 系统校验商品状态、价格和库存。
- 系统计算优惠、运费和应付金额。
- 创建订单并冻结资源。
- 发起支付,等待支付结果回调。
- 支付成功后确认订单、扣减库存、核销优惠券。
- 触发仓储履约、发货通知、消息推送。
如果你只把这看成“几个接口顺序调用”,系统很快就会乱。因为这个流程里同时存在:强一致诉求、异步状态推进、失败补偿和高峰流量冲击。
三、如何划分核心模块
| 模块 | 核心职责 | 设计关键点 |
|---|---|---|
| 商品 | 提供可售卖信息 | 读多写少,适合缓存,但要处理价格变更 |
| 库存 | 管理可售数量与预占 | 高并发热点,必须防超卖 |
| 订单 | 承载交易主状态 | 状态流转要清晰,避免流程散落 |
| 营销 | 优惠券、满减、活动规则 | 规则变化频繁,宜隔离复杂度 |
| 支付 | 发起支付、接收回调 | 幂等、对账、回调顺序问题很关键 |
| 履约 | 出库、发货、物流跟踪 | 更偏异步,适合事件驱动 |
注意,这里最重要的不是“分了几个模块”,而是每个模块的职责是否足够单一,状态和数据归属是否清楚。
四、下单链路里最容易出事的 5 个点
1. 库存超卖
热点商品最怕并发扣减。常见手段包括库存预占、乐观锁、原子扣减、队列削峰。真正关键不是某个技术,而是你要明确:库存什么时候冻结,什么时候确认扣减,什么时候释放。
2. 金额不一致
前端看到的价格、下单时计算的价格、支付时的价格、财务对账的价格必须可追溯。价格计算逻辑不要散落在多个服务和多个前后端位置,否则排查极其痛苦。
3. 支付回调重复或乱序
支付平台的回调不是你想象中“只来一次、顺序正确”。重复回调、网络抖动、延迟到达都很常见。因此订单更新必须幂等,状态机必须有合法流转校验。
4. 局部成功、整体未完成
比如订单创建成功了,库存冻结了,但支付结果迟迟没回来;或者支付成功了,但履约系统处理失败。这类问题说明你面对的是分布式流程,不是单函数调用。必须设计补偿、重试和人工兜底。
5. 营销逻辑污染主链路
优惠券、满减、会员价、秒杀、拼团最容易把系统搞复杂。正确做法不是把所有规则都塞进订单服务,而是把营销计算做成相对独立能力,通过清晰接口参与主链路。
五、一个更合理的设计思路
下单主流程可以保持“订单为核心状态机”,其他模块围绕状态变化协作:
- 订单服务负责交易主状态,不承担所有业务细节。
- 库存服务负责预占、确认、释放三类动作。
- 支付服务负责支付单和回调处理,结果通过事件通知订单。
- 履约服务订阅“已支付可履约”事件,异步推进仓储流程。
- 通知、积分、推荐等边缘能力尽量异步,不阻塞主链路。
这样一来,系统的同步主路径会比较短,而复杂扩展能力通过异步事件逐步展开,主链路更稳,整体也更易演进。
六、为什么这个案例能说明架构设计的重要性
因为你会发现,真正难的从来不是“写一个创建订单接口”,而是设计好整个系统的职责边界、状态流转和异常处理方式。架构设计的重要性,恰恰体现在这些地方:
- 业务复杂后,代码还能不能保持清晰。
- 高峰流量下,主链路能不能稳定。
- 异常场景下,数据能不能收敛。
- 需求不断变化时,改动是否能局部化。
七、从这个案例里你该学会什么
架构设计不是把系统拆开,而是把复杂流程重新组织成可控的职责、状态和协作关系。
只要你真正看懂这一点,后面面对教育、SaaS、社区、内容、电商、交易、物流等系统,分析方法其实都差不多:先找核心流程,再找状态,再划边界,再设计异常和演进。


评论