• 
    联系我们

    广东联迪信息科技有限公司

    服务热线

    网络集成:400⑻99-0899

    软件支持:400⑻877⑼91

    咨询热线

    公司前台:0756⑵119588

    公司传真:0756⑵119578

    售前咨询:0756⑵133055

    公司地址

    珠海市香洲区兴华路212号能源大厦2楼

    社会新闻
    当前位置 > 首页 > 社会新闻

    公司年会爆点:抽奖系统可以这样开发

    种别:社会新闻发布人:联迪发布时间:2017-01⑴6

    年会将近,而年会抽奖环节必不可少,但是抽奖系统却还没有。所以某1天,PM走过来讲:小伙,手头的需求修完成了吧!在年会开始之前必须做出1个抽奖系统。这个系统很简单,后台可以设置总金额,然后每一个用户可以取得的金额范围,金额派完则显示很遗憾没有中奖,还要设置抽奖活动时间。

    公司年会爆点:抽奖系统可以这样开发

    需求分析

    1看这东西,就觉得非常简单。最简单的1个方案,活动时间放在1个数据表,总金额和已使用金额寄存在1个表,已派送的日志1个表。后台提供1个接口,客户端手动点击按钮,则发送1个要求。账号体系直接使用微信的oauth,接口首先判断活动有无开始,如果开始则随机1个金额,然后判断如果派送该金额会不会超预算,如果不超预算,则调用微信的现金接口发放零钱。

    公司年会爆点:抽奖系统可以这样开发

    并提问题

    这个简单方案存在1个致命的问题,就是并发下,可能导致超预算的问题。如果采取加锁的方式,面对1000多员工同时要求,系统100%瘫痪。(由于抽奖系统的服务器是最普通的1核1G 1M带宽的服务器)

    公司年会爆点:抽奖系统可以这样开发

    那末不加锁的情况,又能如何避免并发酿成的派送超过预算的问题呢?1个简单的办法,把分配派送金额的操作从并行变成串行。那末就需要异步的编程方法。最简单的处理方法,把任务写入mysql,然后启动1个独立的进程来1个任务1个任务的串行处理。异步的话,客户端如何知道服务器已处理了呢?最简单就是采取轮询的方法了,客户端每隔几秒就要求服务器1次。

    公司年会爆点:抽奖系统可以这样开发

    性能问题

    由于抽奖是短时间大量用户要求的,如果直接让要求落到mysql,类似DDOS攻击,1般的数据库是扛不住的。而redis是1种基于内存的高并发NoSQL,在很多公司广泛使用,由于其性能非常好,并且其丰富的数据接口完全可以胜任抽奖任务需求。这个时候,你可能有这样的疑问,我们的系统设计是怎样样的呢?

    • 抽奖系统相干配置存储在redis的1个key值,直接使用json格式

    • 客户端要求的时候判断,时间是否是在活动时间范围内

    • 客户端要求如果时间在活动范围内,则把用户添加到1个redis集合,用于避免用户重复要求,只有第1次要求才会添加到集合后,再添加到1个redis列表。

    • 后台1个独立的进程,从redis列表pop第1位用户,然后分配1个金额,然后把金额和用户信息压入另1个redis列表B,同时写入redis的hash结构,标示用户获很多少现金。1直循环该进程。

    • 后台另1个独立的进程,从redis列表B pop第1位用户,然后调用发送现金接口,1直循环该进程。

    • 客户端不停轮询获得用户金额的接口,该接口从哪个hash结构获得用户金额,然后没有数据,则告知客户端若干秒后再次要求。

    公司年会爆点:抽奖系统可以这样开发

    前端优化

    由于参与活动的人数较多,而且服务器是放在外网的,所以需要考虑带宽的问题。

    • 第1步,把静态资源放到cdn。

    • 第2步,抽奖页面静态化,同时也放到cdn,这样子服务器只需要承受用户要求和登录即可。

    • 第3步,由于采取了微信登录,所以登录系统采取1个独立的进程,并且使用异步框架来处理高并发。

    • 第4步,前端发送要求队列化处理,避免用户不停点击,造成大量要求。

    公司年会爆点:抽奖系统可以这样开发

    总结

    • 整套系统开发没有任何难度,唯1需要注意高并发下性能和数据问题。

    • 静态资源放到cdn,避免带宽成为瓶颈。

    • 把mysql操作变成redis操作,解决io问题。