知识卡片

库存一致性取舍:放弃"全体用户看到的规律一致",改保"单个用户看到的规律一致"

普通读书笔记卡

内容

抢购场景下库存数字会被大量用户高频刷新查看,如果要求”任意时刻所有用户看到的库存数字都完全一致、且严格按真实扣减规律递减”,这本质上是一个数据强一致性要求,实现成本极高,而且即使投入大量成本也只能逐渐逼近这个效果,很难做到真正的完美强一致。抢购系统给出的取舍是退而求其次:放弃”所有用户之间看到的库存必须一致”这个目标,转而只保证”单个用户在自己这次操作过程中,看到的库存变化是符合规律的、不会跳变”——具体做法是让用户排队,一旦某个用户抢到名额,才对抢购库里的库存做递减操作,这样单个用户在自己操作期间感受到的库存变化始终是平滑递减的,不会出现”这次看到还剩10个,下一次刷新又看到还有11个”这种明显违反直觉、破坏体验的跳变;但不同用户之间看到的库存数字完全可能存在不一致(因为各自请求到达的时间和处理顺序不同)。这个案例是一次教科书式的一致性取舍案例:面对”强一致性成本极高、但用户体验又不能太差”这对矛盾,与其花大力气去追求所有用户视角完全一致这个理论上限、结果实现成本高企且效果永远差一点,不如换个角度重新定义”体验好”到底指什么——用户真正在意的往往不是”和别人看到的数字完全一样”,而是”自己感知到的变化过程要合理、不突兀”,把一致性的粒度从”全局”收窄到”单用户会话”,用远小得多的成本达成了用户真正在意的那部分体验。

参考来源

- 位置:《高可用架构(第1卷)》第3章《电商架构热点专题》"3.3 秒杀系统架构解密与防刷设计"节,"3.3.4 如何保证商品库的库存可靠"(源文件:_epub-src/OEBPS/Text/Chapter3_3_5.xhtml) - 结论依据:原文说明"要么保证大家看到的库存规律一致,要么保证单个用户看到的库存规律一致。若保证大家看到的库存减少的规律一致……这就对系统有数据强一致性要求,需要很大成本,还只能逐渐逼近此需求要求的效果。而我们若选择后者……虽放弃了数据强一致,但以更少的时间尽可能实现了最好的效果",直接支撑本卡片结论。 - 原始内容:要么保证大家看到的库存规律一致,要么保证单个用户看到的库存规律一致……若保证大家看到的库存减少的规律一致……这就对系统有数据强一致性要求,需要很大成本……而我们若选择后者,仅保证单个用户看到的库存减少规律一致,虽放弃了数据强一致,但以更少的时间尽可能实现了最好的效果。