• 如何实现“秒杀”系统


    昨晚和一公司工作几年的同事闲扯了一些程序人生和技术问题。感觉自己目前的经验还是太少太少了,看的书也不是太多,惭愧啊。

    就比如同事问了我一个如何做一个我们很常见的“秒杀”系统,我当时一拍脑门直接回答说加个排它锁不就行了么,但是晚上回到家里google了一番之后,深深的感到脸红啊。一个看似简单的“秒杀”系统,里面涉及到的东西也着实不少,而不仅仅是一个简单的加锁就行了的。我大致整理了一下我想到的和google到的需要注意的地方,当然有很多的不足,同时也希望大神们能够指点一点:

    1) 对现有网站业务的冲击

    因为秒杀活动只是网站营销的一个附加活动,这个活动具有时间短,并发访问量大的特点,如果和网站原有应用部署在一起,必然会对现有业务造成冲击,稍有不慎可能导致整个网站瘫痪。

    2) 高并发情况以及数据库的负载

    用户在秒杀开始前,通过不停的刷新浏览器页面以保证不会错过秒杀,这些请求如果按照一般的网站应用架构,访问应用服务器、连接数据库,会对应用服务器、数据库服务器造成极大的负载压力。

    3) 突然增加的网络和服务器带宽

    假设商品页面大小200K(主要是商品图片大小),那么需要的网络和服务器带宽是2G(200K×10,000),这些网络带宽是因为秒杀活动新增的,超过网站平时使用的带宽。

    4) 直接下单

    秒杀的游戏规则是到了秒杀时间才能开始对商品下单购买,在此时间点之前,只能浏览商品信息,不能下单。而下单页面也是一个普通的URL,如果得到这个URL,不用等到秒杀开始就可以下单了。

    5) 防止机器秒杀

    防止网上的一些“秒杀器”

    针对上面的5个问题,对应的策略如下:

    1)  秒杀系统独立部署

    为了避免因为秒杀活动的高并发访问而拖垮整个网站,使整个网站不必面对蜂拥而来的用户访问,将秒杀系统独立部署,如果需要,还可以使用独立的域名,以和网站完全隔离,即使秒杀系统崩溃了,也不会对网站造成任何影响。

    2)  秒杀商品页面静态化

    秒杀商品页面重新设计,不使用网站原来的商品详情页面,页面内容静态化:商品描述,商品参数,成交记录,用户评价全部写入一个静态页面,用户请求不需要经过应用服务器的业务逻辑处理,也不需要访问数据库。所以秒杀商品服务不需要部署动态的Web服务器、数据库服务器。

    3)  租借秒杀活动网络带宽

    对于因为秒杀新增的网络带宽,必须和运营商重新购买或者租借。为了减轻网站服务器的压力,需要将秒杀商品页面缓存在CDN,同样需要和CDN服务商临时租借新增的出口带宽。

    4)  动态生成随机下单页面URL

    为了避免用户直接访问下单页面URL,需要将该URL动态化,即使秒杀系统的开发者也无法在秒杀开始前访问下单页面的URL。办法是在下单页面URL加入由服务器端生成的随机数作为参数,在秒杀开始的时候才能得到。

    5)  防止秒杀器感觉很难,

    因为似乎总是有办法可以跳过设置的“障碍”。真正做到防止,仅靠webserver怕是很难防范,一般的做法都是增加一些人为的“障碍”,比如:

    注册时有一定的门槛,像皮皮书屋一样,通过输入程序执行结果作为验证 –à之前批量手工注册

    参加秒杀的积分或者等级策略 -à 挂太阳,就如同你当你为了升级QQ等级的时候一直挂着QQ一样。

    验证码,阻止自动化操作 -à 可以图像识别

    ip阻止 –à 但是ip可以伪造,可以代理

  • 相关阅读:
    刷题总结——table(ssoi)
    算法复习——差分约束(ssoi种树)
    刷题总结——谈笑风生(主席树+dfs序的应用)
    刷题总结——序列操作(权值线段树套树状数组)
    刷题总结——shortest(ssoi)
    算法总结——主席树(poj2104)
    刷题总结——路径(ssoi)
    刷题总结——鸭舌(ssoi)
    刷题总结——电影(ssoi)
    刷题总结——随机图(ssoi)
  • 原文地址:https://www.cnblogs.com/rollenholt/p/3393398.html
Copyright © 2020-2023  润新知