秒杀项目常见面试题
0、介绍一下你的项目?
为什么做这个项目?
希望将过去所学的一些知识做一个系统的深入理解。秒杀项目运用场景多,涉及的问题与中间件较为复杂,更有利于对web服务的深入学习。
详细过程?
本项目主要是为了模拟一种高并发的场景,请求到达nginx后首先经由负载轮询策略到达某一台服务器中(后端部署了两台服务器)。为了解决秒杀场景下的入口大流量、瞬时高并发问题。引入了redis作为缓存中间件,主要作用是缓存预热、预减库存等等。引入秒杀令牌与秒杀大闸机制来解决了入口大流量问题。引入线程池技术来解决了浪涌(高并发)问题。
1、秒杀中如何处理超卖问题?(网易)(百度)(美团)(滴滴)(字节)
直接由数据库操作库存的sql语句如下所示。依靠MySQL中的排他锁实现
update table_prmo set num = num - 1 WHERE id = 1001 and num > 0
利用redis
的单线程特性预减库存处理秒杀超卖问题!!!
- 在系统初始化时,将商品以及对应的库存数量预先加载到
Redis
缓存中;(缓存预热) - 接收到秒杀请求时,在
Redis
中进行预减库存(decrement),当Redis
中的库存不足时,直接返回秒杀失败,否则继续进行第3步; - 将请求放入异步队列中,返回正在排队中;
- 服务端异步队列(MQ)将请求出队,出队成功的请求可以生成秒杀订单,减少数据库库存,返回秒杀订单详情。
2、秒杀中如何解决重复下单问题?(网易)
mysql
唯一索引(商品索引)+ 分布式锁
3、热点数据失效(缓存击穿)问题如何解决?(网易)(美团)
设置热点数据永远不过期。
4、缓存和数据库数据一致性如何保证?(shopee)(美团)(网易)
-
使用canal组件实现(canal的原理,模拟MySQL的主从复制机制)
-
更新数据库后立即删缓存,然后下一次查缓存找不到数据后会再次从数据库同步到缓存。
5、减库存成功了,但是生成订单失败了,该怎办?(shopee)(美团)(华为)
非分布式的系统中使用Spring提供的事务功能即可。
**分布式事务:**将减库存与生成订单操作组合为一个事务。要么一起成功,要么一起失败。
CAP理论(只能保证 CP、AP)、BASE理论(最终一致性,基本可用性、柔性事务)。
分布式事务的两个协议以及几种解决方案:
- 全局消息
- 基于可靠消息(MQ)的分布式事务
- TCC
- 最大努力通知