TDEngine游戏平台框架逻辑
服务器组成
服务器由网关服(可多个),大厅服(可多个),和游戏逻辑服组成,其中游戏逻辑服可布置在大厅服上,详情请参考下图
如果没有外部负载均衡或者偏小型的服务器,网关服当做负载均衡,大厅即为实际服务器
服务器连接情况
客户端
客户端只与网关服进行连接
网关服
网关服会监听两个端口,一个是来自客户端的端口,一个是来自大厅服的接口,网关服会连接Redis服,并定时的把自己的地址及负载情况通知出去。
收到来自客户端的请求,建立连接,会分配一个对应处理的大厅服,完成验证后,之后的消息会传给相对应的大厅服,如果没有任何大厅服,则直接拒绝接受请求,关闭客户端的连接
收到来自大厅服的请求(Ps.这里通过监听地址和防火墙来进行验证,也就是能连上此端口的都认为是合法的连接,不接受公网的请求),记录大厅服的连接
大厅服
大厅服启动时会连接Redis取所有的网关服连接,然后选择负载比较小的网关服进行连接。如果未发现任何的网关服,会定时的重新取,并重连直到连上网关服为止,一个大厅服同时只会连接一个网关服
接受网关服转发过来的消息,进行真正的逻辑处理。
如果信息为房间的信息,则通过Redis发布订阅到指定的频道,让指定房间服接收消息
订阅以此服务器id的Redis频道,其它服得知服务器id可通过id发布消息到该频道
房间服
房间服会连接Redis然后订阅此房间名字的渠道,通常来说一组服务器内,房间名唯一的,也就是同时最多只有一台服务器服务于一个房间
房间服并不持有用户的实际对象,比如玩家进入斗地主服务器,大厅服只会把玩家的基本数据和斗地主相关的数据及服务器id发给斗地主房间服,所以对玩家来说他只有连上了任一一个大厅服,他就可以进这组服务的任意玩家,并且这个房间服的玩家不要求在同一个大厅服
房间服会定时把自己的房间及游戏类型及进入房间人数发布出去,由大厅服接收房间数据并解析
用户异常情况
用户掉线
用户掉线时会发布掉线消息,此用户的对象不会被立刻进行析构
如果此用户不在游戏状态中,则房间服接受到掉线消息,让玩家离开已进入的桌子,并且退出房间
如果此用户正在游戏中,则房间服会把消息推送给其它与之正在玩游戏的人,并自动为其拖管,直至游戏结束或者重连上来
用户登陆
- 如果此用户在别的服务器上登陆,或者已掉线但对象并没有被析构,则此时通知析构此玩家对象,等待析构完成之后跳转到2
- 正常的处理登陆流程,登陆成功后发布消息登陆成功,如果房间服接受到有此用户在此房间内,则推送消息给客户端上次进入哪个房间,进入后正常的参与游戏