中等难度的题,一个典型的部分失败场景题。
一句话总结就是失败了就当做是秒杀失败。大部分人在这个问题下会提到引入重试机制,但是这没有抓住重点,因为面试官会进一步追问你,如果要是重试都失败了,怎么办?
所以你在面试中可以回答重试,但是不能只回答重试,要进一步回答重试都失败了,该如何处理。
但是重试都有可能失败,那么就要返回用户秒杀失败的响应。而接下来要考虑的问题就是要不要补偿 Redis,也就是将库存还原回去。
第一种选择就是不还回去,那么 Redis 中的库存就会比 MySQL 中的少。但是这里有一种特殊的场景要注意,就是如果 Kafka 其实收到了消息,那么消费者会锁定创建订单,锁定库存,最终因为订单没有人支付而最终被取消,库存也会被释放。因此最终的结果就是商品会少卖。
第二种选择是补偿 Redis 中的库存,也就是将库存还回去。如果要是库存还回去失败,那么等价于第一种选择。而如果还回去了,那么又会出现一种情况,即消费者创建订单、锁定库存之后,在超时释放库存之前,数据库中的可用库存比 Redis 中的要少。
Redis库存可能多可能少,少卖可能超卖不可能
超卖问题;