首页 > 试题广场 >

全民飞机大战是腾讯研发的一款非常好玩的休闲游戏,游戏内的社区

[问答题]
全民飞机大战是腾讯研发的一款非常好玩的休闲游戏,游戏内的社区“飞行学院”。有一个功能是让某些玩家能获得系统赠送的钻石并以红包形式分享给自己的粉丝。比如系统赠送200钻石,玩家可以把它分成20份并分享给自己的10万个粉丝。假如是你来设计开发这个红包功能,你会怎样解决一下问题?
1. 钻石的最小单位是1,如何设计钻石分配算法?
2.红包份数有限,高并发情况下怎么解决固定份数和限额的问题?
3.如果高峰阶段,抢红包的并发请求数可能达到8000次/秒,使用什么样的存储系统可以支持该方案?
1、10万个粉丝应该会有很多个粉丝群,不妨假设每个粉丝群总数被限定为1000,则其有100个粉丝群,而砖石总共只有20分,所以应该用随机分配算法分配到某20个粉丝群中,随机算法有很多,可以先产生20个不同的随机数(带时间种子的rand()函数),再对100进行求余。
然后就是一个粉丝群抢红包问题了,可以参考微信抢红包随机算法(网上一大堆)
2、这个我不太清楚。。。。。
3、可以将每个红包生成唯一的红包ID,根据请求顺序,进入队列。队列先进先出,满足要求,还可以根据每个红包的剩余砖石数量为0,拒接无效请求,直接返回客户端红包抢光了(其实就是微信红包架构)。
发表于 2017-09-03 11:05:56 回复(0)
1.对200个钻石的分配,如何分配使结果真正符合随机。
一般来说有两种办法,一种是提前预设好多种分配方案中,在多种方案中随机选择
另一种是算法解决,使用插板法,200个钻石间有199个间隔,在199个间隔中随机选19个位置插板,即可将200个钻石随机的分为20个红包(上面几个人说的方法,在实际操作中会出现很多问题)
2.不明白题意。可能是说高并发下,服务器无法承担1中的分配算法,如果是这样,就按1.1方案即可解决
3.题目意思是一台服务器肯定是承受不了的,那就要多台服务器来承担服务,那么存储系统就涉及到分布式存储,可以通过纵向分割,将红包分到多个奖池中,由多台设备分别负责,再通过负载均衡(前端分流,路由分流)来实现分流。在单一设备上使用队列处理

编辑于 2017-09-16 22:47:57 回复(0)
补一下第二题的答案,高并发情况下想到的就是要避免出现状态不一致的问题,那么引入锁机制。
发表于 2019-12-15 12:27:45 回复(0)
关于第二个问题,我的想法是用提前判伪的方法解决,如果我理解对题意的话😂
用java中的Atomic类(保证线程安全)设一个计数器,每一次抢红包的请求都使计数器加1,当计数器大于红包份额时,对其他用户的请求都返回“红包已抢完”之类的提示,不进入到业务逻辑进行处理,这样应该可以拦截大多数的请求,不至于使后台系统在高并发的情况下挂掉。而针对抢到红包的请求,如果请求量仍然很大的话,还可以进一步用消息队列、缓存做削峰和减压处理。
发表于 2019-09-16 20:43:50 回复(0)
我的想法是每个群都有一个含有10个砖石的红包,这样保证公平,由粉丝们去抢。维护一个先进先出请求队列存储粉丝们点击红包后的请求,逐一处理队列里面的请求,每次请求前判断砖石数量是否为零,如果为零,返回客户端红包已经被抢光;每个请求分配随机数额的砖石(带时间种子的rand()函数,1-当前砖石个数)。
高峰阶段,抢红包的并发请求数可能达到8000次/秒,使用什么样的存储系统可以支持该方案?
分布式、负载均衡、锁机制。
只是一点想法,也不知道是不是可行

发表于 2017-09-13 14:44:28 回复(0)
 
发表于 2017-08-29 10:54:46 回复(0)