秒杀设计方案
在原有项目上继续加
会导致程序因为并发量崩溃,数据出现问题,都会影响原来的项目
单独写一个服务
重新设计库(几个表)
商品表,订单表
并没有多少人秒杀:
- 不要秒超了,上锁(悲观锁,乐观锁,mysql)
- 同步扣款,生成订单
简单地设计方案,数据直接打到数据库上(不推荐)
并发量在几百个
- 把同步换成异步
- celery+redis,同步扣款,生成订单
并发量几千
-
分布式锁(项目部署在多台机器上)
-
用专业的消息队列(异步)
-
限流(有令牌才能近来),有资格秒杀的用户,访问秒杀页面,给一个令牌,放到redis一份,也就是用户一份,redis一份
- 有令牌的,并且在redis中再往后走,只要查过一次就从redis中删除(爬虫不能反复发)
- 对用户最多生成10个令牌,也就是最多秒杀十次
-
请求来了之后,有资格的可以参与秒杀的用户id放到消息队列里(消息队列里可以存上千万,上亿个id)
-
视图直接返回,前端返回一个动图,您正在排队,每隔3s,向后端发送一次请求,查询是否秒杀成功
-
worker一个个的去消费执行,假如1w个都消费完了,
-
现在redis中预热,设置1w个这个数,每消费一个数字-1,生成订单(redis乐观锁)
-
生成订单再写成异步
主要点
限流,锁,异步,秒杀