« 方便的分享照片 | 返回首页 | Lua GC 的源码剖析 (1) »

服务器排队系统的一点想法

今天突然想到的,先记下来。

以前考虑过这个问题,写过一篇 blog 。我今天想到,其实可以把排队完全独立出来。和原有系统分离。这样,所有不支持排队的游戏系统,只要简单加上就可以用了,不用对系统结构做大的调整。

想法是这样的:

游戏系统需要估计自己的环境大约可以支持一定时间段多少人可以进入。这个用来估算每个新用户的大致等待时间。

游戏系统采用一个以时间为演算因子的序列 key ,用来做进入的验证。只有持有这个 key 的用户才认为是经过排队的。允许进入。

排队服务器独立安置,当用户直接连接游戏服务器遇到拥堵时,服务器简单记录他的用户名,和等待鉴权的口令,然后让其去排队服务器排队。如果用户再次连接上来而没有经过排队。因为有用户名记录,所以可以在帐户信息里做记录。之后的处理就比较简单了。

用户的这个流程(先尝试游戏服务器,再被转到排队服务器,并不可以二次尝试),这个过程由用户 Client 保证。用户不修改 Client 是不会违规的。游戏服务器只是记录那些用异常手法插队的用户。

在排队服务器,首先向第一次进来的用户发放序号,以及通知大约等待时间。并记录用户的用户名,以及一个等待鉴权的口令。用户则可以离线,由 Client 等待指定时间再上来排队。为何要提交鉴权口令?因为要防止有人恶意冒充插队。当排队服务器检测到用户不守规定不在规定等待时间内重复尝试,则回头鉴定用户是否的确是本人,而后再决定在其帐号里做违规记录。

等待用户快排到了,则可以向排队服务器保持长连接,直到排队服务器发放进入游戏服务器的口令。他就可以离开队伍,前去游戏了。


这样做这个系统,可以让排队系统和游戏足够分离。便于开发。不受游戏服务器的构架变换影响,也更容易部署。

Comments

这个方法好
云风,看看这个链接,关于中大的: http://t.sina.com.cn/1984147603/zF4kvcsq8Y 绝对不是病毒或广告
看看
欢迎来看看啊
如果领到号的玩家放弃再次登陆,后面的玩家还是按照提示的时间重新登陆的话,中间的时间不是被浪费掉了吗?
可以用非对称加密,让游戏服务器和排队服务器之间不用直接通讯就可以校验key
这倒是个不错的想法
刚又写了一些,提交时出错了。。懒得再码字了。我觉得排队系统还是内嵌在游戏逻辑中处理比较好。诸如wow的战场和随机副本排队系统,不光是一个队列的问题,更是一个matchmaking的过程。另外就是排队系统本身可能会受制于游戏逻辑,诸如插队卡,挤房卡之类,所以这个系统可能并不单纯。结束。。。
用户排队后离线的行为,和用户主动取消排队的行为,应该差异处理么?
把登录也独立出来不就完了吗,干啥要先连游戏网关.一个独立的登录验证服务器,排个几万人,处理几十个区的用户验证小case.网易这种有运营商间跳转网关的结构用独立验证服务器还更好做跳转逻辑.
这个不是和现实中的排队系统很像吗? 不过还是有些不同. 现实中先去领号, 然后等待号码到了, 然后再去对应的柜台. 不知道排队系统需要考虑哪几个技术参数? 消耗的服务器资源和带宽是一个.

Post a comment

非这个主题相关的留言请到:留言本