如何设计一个秒杀系统,其实我思考了很久,今天就把我想到了写下来记录一下:
所谓秒杀操作就是同一时间段内很多用户抢购有限的商品,因此秒杀的并发量是很高的。
用户点击秒杀的时候,会异步的取服务端的时间,然后在执行秒杀,如果执行秒杀的时间小于服务端设定的时间,
那么提示用户秒杀尚未开启,如果时间在秒杀的范围内,服务端会返回秒杀接口地址,一般url的某个字段是加密值,用户点击后可以执行秒杀。
如果秒杀后
前端:
1.通过动静分离 把静态页面部署到CDN上,这样可以降低我们系统的压力,用户的体验也会提高
2.因为秒杀的时候用户可能会一直的刷新,前端可以做一些控制
3.然后通过前端web服务器用nginx 做负载均衡和反向代理
后端:
后端一般都是一个集群
1.在redis集群中维护一个原子计数器(Atomic counter),数量提前设定好,用户请求到来的时候直接对这个原子计数器
进行操作,如果原子计数器大于0那么,减去1,然后插入一条用户秒杀的消息到rabbitmq中(或者其他消息队列),然后又消费者来消费这个rabbitmq产生的消息,把对应的记录写到数据库中;如果原子计数器小与等于0,那么返回秒杀已经结束。
2.如果数据库压力很大,那么对数据库可以进行分库,分表
3.数据库端也可以使用存储过程,减少服务器端到数据库的传输时延,以及服务端GC造成的延迟
前一段时间在面试的时候,面试过跟我分享了一个新的思路,比如1000W个人抢10个商品,那么我只让10条流量进来不就可以了?其他的都到不了我的后台的应用程序,我觉得这是一个很好的一个思路,或许有点不公平,但是对于流量的随机选取 只抽取10条算是比较公平的了。