双十一预热之秒杀系统专场
国庆小长假已经结束了,还没有从吃土的日子中结束,双十一又要来了。像淘宝、京东、拼多多等大型电商平台已经在造势了,技术同学做系统演练、线上压测、性能优化等工作,市场同学在线下平台、广告平台、新媒体平台都在宣传。对于双十一来说,最激动人心的无疑就是秒杀商品了,在限定的时间内,以最便宜的价格,抢到商品。有的人可能会问,那么秒杀系统都是怎么样的呢?我们公司规模比较小,怎么合适的设计秒杀系统呢?今天小编就给大家介绍几种秒杀系统的设计。
在这几种秒杀系统的设计中,最基本的组件就是redis,那么秒杀服务为什么都用redis?答案:性能好。redis基于内存读取数据,而传统的数据库是基于磁盘读取数据。在使用redis数据库时,用户请求来了之后,后端直接去内存获取数据,并且同步把数据写入磁盘,返回给到前端。使用mysql数据库时,用户请求来了之后,后端需要去磁盘获取数据,再返回给到前端。从数据的获取流程来看,Redis很快,并且通过redis性能测试数据,redis单线程QPS达到40000+,能够扛住大量的用户请求,因此实现秒杀系统,使用redis是最好的选择。
对于小公司或个人创业者来说,用户规模没有多大,技术人员也有限,在资源有限的情况下,采取这个方案是最合适的。
通过PHP+Mysql+Linux服务器搭建一个电商网站,在借助Redis实现促销秒杀。小A创建了电商平台shopping,在里面售卖自己平时不用的耳机、键盘、鼠标、电脑,并且把其它同事闲置的电子设备也放在了shopping平台上进行售卖,为了吸引更多的用户来平台购买商品,他想出来一个好主意,就是搞促销,将平台的Mac电脑100元出售,总共5台。促销信息在网站放出来后,一下子吸引来了很多用户。他是这么实现秒杀系统的,用户请求过来,第一步去Redis请求是否有库存数据,如果有的话,则将库存减1,成功创建订单,秒杀成功,如果没有数据的话,则不能创建订单,秒杀失败。
对于有一定业务规模,但是开发资源比较紧张的公司,可以采取这种模式。相比方案1,它增加了一个限流机制,通过访问数的限制,提高了系统性能。还是刚刚的例子,小A创建的二手电子交易平台,随着质量不错、价格合适,积累了一定量的用户。有了用户就需要运营了,因此他也搞搞活动促销啥的,在双十一99元买小米手机,总共50台,促销信息在网站上放出,这时候一下子来了100多个用户,每次都需要去请求redis减库存比较耗费性能,因此在限流算法处设置每秒最多请求20个,超过的请求就排队等着。
对于业务规模中型时,开发资源比较紧张的公司,可以采取这种模式。当业务发展到中型规模时,系统一般会采用集群模式进行部署,也就是把服务部署在多台机器上,同时对外提供服务,提升性能。这时候运营人员可以设置每台机器能处理的最多库存数量,当用户请求进来后,程序判断总请求量与机器库存量大小,如果较小则请求成功,可以购买,如果较大则请求失败。
对于业务中大型规模的公司来说,比如有数10万用户,虽然开发成本高,但由于用户规模、团队规模有一定积累,这种方案是比较适合的。在方案3中主要是靠运营人员或运维根据工作经验判断设置的阈值,不够灵活。同一件商品,因为不同地域人民的消费能力都不一样,在北京区域的售卖情况和在成都云南的售卖肯定不一样。通过在算法中增加多协程判断秒杀现况,动态的扩缩容。当用户过来时,轮询算法初步判断库存是否为空,如果为空则秒杀结束,如果不为空,则进入排队(用户感受就是加入购物车但无法支付),所有的用户请求进入排队队列后,轮询算法再次判断库存情况,决定多少请求可以出队列,出队列的请求用户就可以成功秒杀了。
对于业务体量比较大的公司,比如京东、淘宝、拼多多这种规模级别,服务上亿的用户,研发资源充裕,就可以采用这种方案。当用户在前端发起请求后,通过CDN(内容分发网络)前端可以把商品信息等静态页面信息部署在离用户请求最近的地方,加快用户访问服务,当用户请求进入后端后,通过Nginx负载均衡将请求分发到不同的秒杀服务集群,秒杀服务将信息写入Redis主数据库,再从Redis从数据库获取信息,Redis的主从部署、读写分离,更好的保障了服务高可用,最后再通过MQ消息队列来做流量的削峰(超过阈值请求就进不来了,商品售完了)、用户请求的排队,实现了高并发、高可用、高性能的秒杀系统。
通过本文秒杀系统设计的介绍,相信你已经非常清晰秒杀系统的设计了。双十一很快就到了,又是一年买买买的时刻,赶紧动手设计一个秒杀系统,助力你的业务吧。毕竟双十一过后,又是年终了,一个好的秒杀系统设计,帮你的KPI完成的更好,获得更好的绩效噢!
「璇女神为程序员正名」
任何为人称道的美丽
都来自你的0和1
说得就是你们,程序员
感谢你们这群可爱
而又改变世界的人
10月20日15:00点
璇女神在直播间带着礼包等你!
▼▼▼
你就是你
人群中不一样的烟火