秒杀系统设计 总结

宋鑫    2016-05-04

本文:秒杀系统设计 总结,原创于:宋鑫的官方网站,转载请注明出处,谢谢。

最近在准备面试换工作,遇到一个秒杀方面的面试题,看了些文章,主要参考以下4篇文章,总结下,然后自己也细细思考下细节的处理。

http://www.zhihu.com/question/20496392

http://chuansong.me/n/1334017

http://itindex.net/detail/53237-%E7%A7%92%E6%9D%80-%E7%B3%BB%E7%BB%9F-%E8%AE%BE%E8%AE%A1

http://mengphilip.blog.51cto.com/2243393/1694547

秒杀系统面对的问题:

1.巨大的并发数 2.瞬间并发的HTTP请求量巨大 3.巨大的流量占用,因为不停的刷新页面 4.如果按常规思路,数据库压力极大 5.影响其他网站业务 6.越过秒杀直接下单 7.缓存和数据库中数据不一致。 8.库存问题

问题1: A:使用Netty之类框架,然后对ip进行限定一定时间内的访问,增加一些秒杀答题,或者验证码之类的 B:集群

问题2: 尽量将请求隔离开来,比如对商品A的请求和对商品B的,缩小锁定和并发范围,可以提升性能,增加系统处理的吞吐量,这个很类似于减小锁粒度。

问题3: A:向运营商租借带宽,找CDN。 B:请求尽量拦截在系统上游,只有在活动期间才能点击秒杀按钮, 比如有10件商品,将商品数据先放入缓存,然后用户点击按钮,查询(读请求)直接去缓存中取数据。当缓存或队列中数量为零,直接触发活动结束,在任何下一个客户端请求来之后,直接返回活动结束的界面。

只有队列中有数据的情况下,才能秒杀成功,这样不会造成10个商品,25个人秒杀成功。 将秒杀成功的用户信息放入队列中,异步串行写,然后访问后台业务逻辑,访问数据库,进行库存出库等操作。

问题4:页面静态化,商品描述,商品参数,成交记录,用户评价全部写入一个静态页面,用户请求不需要经过应用服务器的业务逻辑处理,也不需要访问数据库。

充分利用缓存,使用缓存和队列,充分利用缓存比如redis。 将用户的请求范围缩小,比如不让用户刷新页面,而只是不断的点击某一个按钮,刷新局部页面。 分层过滤请求,不让直接压数据库

问题5:隔离请求,秒杀系统独立部署 问题6:动态生成随机下单URL

可能一些业务方面的问题: 比如数据库中的库存是第三方提供的,可能第三方也在进行其他的描述活动,导致缓存和数据库数据不一致的问题?

上面说的只是限量抢购,限时抢购如何做? 如果限时并且限量,那么也要通过缓存做,当缓存长度为零,停止抢购。 如果限时,但不限量,那么就通过将抢购请求入队列,然后异步串行访问数据库。

问题8:对用户id和商品id加唯一索引 该方法完美的解决了超卖与select排它锁导致的并发低的问题,并且4个sql缩减成2个sql语句。极大提升性能 直接抛异常,商品秒杀完了。

库存问题也就是数据库单行更新问题,

采用乐观锁


文章有用?分享给你的朋友们,让更多的人受益


更多精彩干货,尽请关注我的个人微信公众号
wechat