简单题,一句话就能说清楚:想 P 吃。
想象一个最简单的例子,如果秒杀活动根本没人来,你卖给谁?卖给鬼么?
那么当然面试官可能会进一步追问,要是一直有人来参加秒杀呢?很显然,这还用怀疑吗?一直有人买东西你还卖不完吗?
如何设计一个秒杀系统? - 面试ICU (mianshi.icu)
镜像问题:秒杀系统中如何保证不会出现超卖的情况? - 面试ICU (mianshi.icu)
在这个问题底下,刷亮点可以讨论部分失败导致的卖不出去的情况以及对应的补偿措施。
完整内容需要VIP会员权限
从系统设计的角度来说,如果要是一直有人参加秒杀,那么必然是能够卖完。
一直有人,就能卖出去。
超时取消订单
但是,即便是一直有人参加,也要考虑一些容错问题,不然也可能出现卖不完的情况。
其中最典型的场景就是 Redis 预扣库存成功,但是发消息到 Kafka 失败,并且 Kafka 确实没有收到消息。如果这时候没有补偿措施,例如说将库存还原回去,那么就会出现 Redis 的库存比 MySQL 中的库存少的情况。
要解决这个问题,可以考虑在 Redis 中的库存扣减到 0 的时候,再次从 MySQL 中加载库存。在引入这种补偿措施的情况下,有可能出现一种异常情况。
Redis和消息队列操作的部分失败问题
超卖;