秒杀系统的设计

来源:互联网 发布:软件如何做授权加密 编辑:程序博客网 时间:2024/04/24 01:43

      前段时间看了一个笔试题,让设计一个秒杀系统,就是秒杀游戏中的1000件装备,没人限一件。觉得挺有意思,平时不管天猫还是京东都有这样的活动,所以就想了想,记录一下!
基本设计
三个原则:一、公平;二、装备抢完结束;三、尽量减轻系统压力;
假设秒杀系统是对1000个游戏装备A进行秒杀。需要考虑这些事情: 
(1)、用户必须输入验证码才能秒杀(它可以有效防止利用机器秒杀)--保证公平(游戏嘛必须的公平才有人玩儿);
(2)、手快的用户更容易秒杀到物品--(公平);
(3)、只能有1000个装备A被秒杀(资源有限);
(4)、用户参与秒杀后,不一定能拿到物品,因为数量有限(前1000名-现实是残酷的);
(5)、确保每个用户只能秒杀一件---(公平);
       保证(1):防止机器人:返回的交易界面,自然要填写验证码。
       啰嗦几句:验证码相当于一个简单的图灵测试辨别来访者是人还是自动化程序(虽然这样,还是有黄牛票贩子,但是火车票自从新版验证码出世,还是有效果的,虽然有吐槽,呵呵呵 )。主要目的就是防止诸如黑客穷举破解密码、自动化程序注册僵尸用户、灌水回帖、第三方的spider程序恶意抓取网站内容、自动化程序发帖评论blablabla~
       保证(2):假设只使用一个队列。则,每当收到一个用户秒杀请求时,查看session中该用户是否已经参与,查看参与秒杀用户的数量,若满足条件,则将该用户的id放入队列。
       保证(3):很明显,记录秒杀成功的用户数量和装备的全局计数器的读取(加锁)和设值必须放在一个事务里。保证从队列中取出一用户id,将该用户设置为秒杀成功,并把相关数据持久化到数据库。
       保证(4):主要目的减少服务器的压力。做两个全局计数器,一个记录参与秒杀的用户数量,一个记录秒杀成功的用户数量。因为装备有限,只有1000件,可以放1w个客户,但是没必要。所以当用户数量达到1000时候,秒杀活动结束;若未达到500,则查看参与秒杀的用户数量是否达到500×10,若达到,则秒杀结束,否则,允许用户参与秒杀。
       保证(5):当用户U参与秒杀后,需要在session中设置某一flag,以防止该用户进一步秒杀。也就是当用户的session中flag为0时,用户可以参与秒杀,当为1时候,表示不能参与秒杀,因为已经参与过了。
       其他优化:
       (1)、改善客户的体验:可以设置10个队列,每个队列负责100个装备,按用户的秒杀顺序,然后对100挨个返回交易界面,填写信息确认。
例如第1个用户id放入队列1、第2个用户id放入队列2、第3个用户id放入队列3、...、第10个用户id放入队列10、第11个用户id放入队列1、第12个用户id放入队列2。这样,10个队列的前100个放在一起,也就是一个队列情况下的前1000个。
       (2)、减少系统的压力:因为客户端需要轮询结果。session中flag的设置是放在服务器端处理了,为了减少压力,可以在客户端设置cookie。

4 0