知识卡片

利用业务特性做弱一致性妥协

普通读书笔记卡

内容

电商下单需同时保证创建订单和扣库存一致,但TCC等强保证方案性能开销太大。破局点是利用业务容忍边界:”宁可少卖不能超卖”,库存多扣可事后对账回收,绝不能超卖。可选择先扣库存后创建订单,扣库存成功但订单失败就允许暂时多扣,靠后台扫描不一致状态做补偿。发散:高性能又一致的方案往往是吃透业务对错误方向的不对称容忍度。

参考来源

- 位置:第10章《事务一致性》10.2.6节「妥协方案:弱一致性+基于状态的补偿」(源文件:_epub-src/text/part0048.html) - 结论依据:原文明确说明最终一致性异步会导致超卖不可行,TCC和事务状态表性能开销大,利用电商'允许少卖不能超卖'的业务特性,可以先扣库存后创建订单,扣库存成功但订单创建失败允许多扣库存待后台补偿,直接支持卡片论述。 - 原始内容:"既要满足高并发,又要达到一致性,鱼和熊掌不能兼得。可以利用业务的特性,采用一种弱一致的方案……对于电商的购物来讲,允许少卖,但不能超卖……方案1:先扣库存,后创建订单……扣库存成功,提交订单失败,返回失败,调用方重试(此处可能会多扣库存)。"