题目重点:把购物车编辑、价格报价和下单分开,处理多设备修改与价格变化。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 只明确模拟购物车,实际API/优惠/持久化未给。练习支持添加、修改数量、删除、读车及提交quote,line按产品变体区分;价格引擎规则另见Checkout题。
- 购物车不默认保留库存,显示价格不保证结算价;库存/订单提交有独立权威校验。
解题路线
- Cart有ownerId/version,CartLine有lineId/productVariantId/quantity,价格展示来自报价快照。产品下架后保留不可购买状态让用户知道,不直接静默删行。
- add语义是增加数量还是设目标数量须明确。练习PUT line设置数量并用expectedVersion CAS;重复请求相同目标不重复加,数量0按删除规则处理。
- Checkout绑定cartVersion与quoteId,报价包括价格/折扣规则版本和到期。确认前重新核库存/授权/quote状态,变更金额需用户确认,而非默默使用新价格。
- 多设备冲突可返回当前版本给用户重试;若自动合并,增量操作需operationId、顺序和删除优先规则。简单最后写入覆盖会丢另设备购物车修改。
- 创建订单通过幂等checkoutKey,成功后消费对应cartVersion;后续用户新加的商品不能被旧checkout回调清空。外部支付结果未知也不能直接再次创建订单。
手动走一遍
手机v3数量2,网页基于v3设3成功至v4,手机再基于v3删行被版本冲突拦下。quote金额20到期后变22,需要重新确认。v4下单后用户创建v5新行,旧回调只完成v4,不清空v5。
规模与取舍
单行索引更新约O(log L),重算quote需O(L)行加规则处理;购物车L行,历史版本/事件依保留预算。按cartId分区可扩吞吐,同cart修改仍需版本一致性。
易错点与追问
容易失分的边界
- add重试多加一件。
- 购物车展示价当永久下单价。
- 旧结算回调把新购物车清空。
继续深挖
- 访客购物车登录后如何与已有购物车合并?
- 库存预留何时发生,过期如何恢复且不影响新订单?
