TDEngine游戏平台框架逻辑
2016-05-13 20:47
288 查看
摘要: TDEngine游戏平台框架逻辑
TDEngine游戏平台框架逻辑
![](https://raw.githubusercontent.com/tickbh/tdengine/master/doc/img/network_structure.png)
如果没有外部负载均衡或者偏小型的服务器,网关服当做负载均衡,大厅即为实际服务器
收到来自客户端的请求,建立连接,会分配一个对应处理的大厅服,完成验证后,之后的消息会传给相对应的大厅服,如果没有任何大厅服,则直接拒绝接受请求,关闭客户端的连接
收到来自大厅服的请求(Ps.这里通过监听地址和防火墙来进行验证,也就是能连上此端口的都认为是合法的连接,不接受公网的请求),记录大厅服的连接
接受网关服转发过来的消息,进行真正的逻辑处理。
如果信息为房间的信息,则通过Redis发布订阅到指定的频道,让指定房间服接收消息
订阅以此服务器id的Redis频道,其它服得知服务器id可通过id发布消息到该频道
房间服并不持有用户的实际对象,比如玩家进入斗地主服务器,大厅服只会把玩家的基本数据和斗地主相关的数据及服务器id发给斗地主房间服,所以对玩家来说他只有连上了任一一个大厅服,他就可以进这组服务的任意玩家,并且这个房间服的玩家不要求在同一个大厅服
房间服会定时把自己的房间及游戏类型及进入房间人数发布出去,由大厅服接收房间数据并解析
如果此用户不在游戏状态中,则房间服接受到掉线消息,让玩家离开已进入的桌子,并且退出房间
如果此用户正在游戏中,则房间服会把消息推送给其它与之正在玩游戏的人,并自动为其拖管,直至游戏结束或者重连上来
正常的处理登陆流程
3ff0
,登陆成功后发布消息登陆成功,如果房间服接受到有此用户在此房间内,则推送消息给客户端上次进入哪个房间,进入后正常的参与游戏
TDEngine游戏平台框架逻辑
服务器组成
服务器由网关服(可多个),大厅服(可多个),和游戏逻辑服组成,其中游戏逻辑服可布置在大厅服上,详情请参考下图![](https://raw.githubusercontent.com/tickbh/tdengine/master/doc/img/network_structure.png)
如果没有外部负载均衡或者偏小型的服务器,网关服当做负载均衡,大厅即为实际服务器
服务器连接情况
客户端
客户端只与网关服进行连接网关服
网关服会监听两个端口,一个是来自客户端的端口,一个是来自大厅服的接口,网关服会连接Redis服,并定时的把自己的地址及负载情况通知出去。收到来自客户端的请求,建立连接,会分配一个对应处理的大厅服,完成验证后,之后的消息会传给相对应的大厅服,如果没有任何大厅服,则直接拒绝接受请求,关闭客户端的连接
收到来自大厅服的请求(Ps.这里通过监听地址和防火墙来进行验证,也就是能连上此端口的都认为是合法的连接,不接受公网的请求),记录大厅服的连接
大厅服
大厅服启动时会连接Redis取所有的网关服连接,然后选择负载比较小的网关服进行连接。如果未发现任何的网关服,会定时的重新取,并重连直到连上网关服为止,一个大厅服同时只会连接一个网关服接受网关服转发过来的消息,进行真正的逻辑处理。
如果信息为房间的信息,则通过Redis发布订阅到指定的频道,让指定房间服接收消息
订阅以此服务器id的Redis频道,其它服得知服务器id可通过id发布消息到该频道
房间服
房间服会连接Redis然后订阅此房间名字的渠道,通常来说一组服务器内,房间名唯一的,也就是同时最多只有一台服务器服务于一个房间房间服并不持有用户的实际对象,比如玩家进入斗地主服务器,大厅服只会把玩家的基本数据和斗地主相关的数据及服务器id发给斗地主房间服,所以对玩家来说他只有连上了任一一个大厅服,他就可以进这组服务的任意玩家,并且这个房间服的玩家不要求在同一个大厅服
房间服会定时把自己的房间及游戏类型及进入房间人数发布出去,由大厅服接收房间数据并解析
用户异常情况
用户掉线
用户掉线时会发布掉线消息,此用户的对象不会被立刻进行析构如果此用户不在游戏状态中,则房间服接受到掉线消息,让玩家离开已进入的桌子,并且退出房间
如果此用户正在游戏中,则房间服会把消息推送给其它与之正在玩游戏的人,并自动为其拖管,直至游戏结束或者重连上来
用户登陆
如果此用户在别的服务器上登陆,或者已掉线但对象并没有被析构,则此时通知析构此玩家对象,等待析构完成之后跳转到2正常的处理登陆流程
3ff0
,登陆成功后发布消息登陆成功,如果房间服接受到有此用户在此房间内,则推送消息给客户端上次进入哪个房间,进入后正常的参与游戏
项目地址
TDEngine相关文章推荐
- Rust 1.35 发布,及Rust升级方法
- 如何在 Linux 中安装 Rust 编程语言
- 为什么 Linux 用户应该试一试 Rust
- 详解Lua中的表的概念及其相关操作方法
- Lua编程示例(二):面向对象、metatable对表进行扩展
- 把Lua编译进nginx步骤方法
- Lua脚本自动生成APK包
- Lua中的元表(metatable)、元方法(metamethod)详解
- Lua中的metatable介绍
- Lua中ipair和pair的区别
- Lua中的函数精讲笔记
- 浅谈Lua的面向对象特性
- 详解Lua中的变量相关知识点
- Lua脚本语言入门笔记
- Lua脚本调用外部脚本
- 详解Lua中的if语句的使用方法
- Lua中调用函数使用点号和冒号的区别
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中强大的元方法__index详解
- Lua中调用C++函数示例