登录排队
实现登录排队。gs统计负载,当都达到上限时,用户排队登录。
登录排队服务器
Section titled “登录排队服务器”整个服务集群有一台专用的登录排队服务器,他监控gs的负载,负责排队让用户进来登录。 这个取名:LoginQueueServer
系统各部分介绍
Section titled “系统各部分介绍”- Gs 游戏服务器,通过LoginQueueAgent连接LoginQueueServer,并通过这个连接向LoginQueueServer报告自己的负载。
- LoginQueueServer 独立的Tcp服务,维护用户登录队列。
- LoginQueueAgent 登录排队服务内部客户端接口,由Gs使用。
- LoginQueueClient 登录排队服务客户端接口服务,由客户端使用。
- Linkd 游戏连接服务,用户登录游戏需要通过这个服务连接,并由他转发请求给Gs。Linkd也链接LoginQueueServer并报告自己的负载。
开启登录排队配置和步骤
Section titled “开启登录排队配置和步骤”- Gs的zeze.xml增加到LoginQueueServer连接的LoginQueueAgent的配置。
- Linkd的zeze.xml增加到LoginQueueServer连接的LoginQueueAgent的配置。
登录排队服务各部分算法描述
Section titled “登录排队服务各部分算法描述”- Gs连接LoginQueueServer,ProviderLoadBase.java 实现报告自己的负载。
- LoginQueueServer维护一个LoginQueueClient的所有用户连接的队列。当有Gs空闲时,向用户连接发放 一个算法加密的token。token包含具体gs的信息和过期时间信息。
- LoginQueueClient连接LoginQueueServer,并得到当前队列的数量。当前队列数量定时更新。当到达队头时 会收到token。
- 客户端从token中得到需要连接的Linkd,连接linkd发送auth,需要带上loginqueuetoken,
- Linkd收到Auth和token,在Auth步骤的最后一步,手动调用一下choiceProvider(link, token)。 这个方法内部提供。
启动和配置LoginQueue
Section titled “启动和配置LoginQueue”- 启动LoginQueue服务 使用下面的配置,文件名为loginQueue.xml,启动 java -cp zeze.jar:… Zeze.Service.LoginQueue
<?xml version="1.0" encoding="utf-8"?>
<zeze> <!-- LoginQueue 给登录用户开放的端口 --> <ServiceConf Name="LoginQueue"> <Acceptor Ip="127.0.0.1" Port="5020"/> </ServiceConf>
<!-- LoginQueue 给内部服务开放的端口 --> <ServiceConf Name="LoginQueueServer"> <Acceptor Ip="127.0.0.1" Port="5021"/> </ServiceConf></zeze>- 配置两个地方 在linkd.xml和gs.xml里面分别增加LoginQueueAgent配置。
<ServiceConf Name="LoginQueueAgent"> <Connector HostNameOrAddress="127.0.0.1" Port="5021"/> </ServiceConf>-
linkd编写代码 linkd收到客户端携带LoginQueueToken的Auth协议,在ProcessAuthRequest的处理最后调用 App.LinkdProvider.choiceProvider(rpc.getSender(), rpc.Argument.getLoginQueueToken()) 如果choiceProvider成功则最终返回Auth成功,否则告知Auth失败。
-
客户端(lua)
ConnectLoginQueue(ip, 5020)
实现network.lua里面的三个回调。
local function OnQueueFull() -- 报告错误end
local function OnQueuePosition(queuePosition) -- 报告队列位置end
local function OnLoginToken(LinkIp, LinkPort, Token) -- 排队成功 loginQueueToken = Token; -- 保存token Connect(LinkIp, LinkPort)end
function network.on_connected() local p = Auth::new() p.LoginQueueToken = loginQueueToken; ... 其他参数 p.send();end