由于公司业务扩展,CEO打算开发一个房卡模式的棋牌游戏,正好本人对游戏服务器也很感兴趣,
所以就接下这个任务,打算自己从0开始用C++开发一个棋牌游戏服务器。
总体架构
之前在开发一个老虎机服务器的时候就吃过过度设计的亏,因此在这次的设计时,我的原则是,
尽可能简单,但是又要保证以下两点:
- 服务器能够实现动态扩容,也就是用户量增长到一定程度时可以横向扩展服务器的负载
- 服务器在出现故障或者被攻击的时候可以下线,尽量可以做到游戏转移(后面发现转移比较复杂,先搁置…)
根据上面的核心原则,我设计了一个简单的架构:
- 大厅服务器,使用restfulAPI的方式提供服务,功能:用户查看自己的历史战绩、查看自己的房卡数目、
创建游戏房间、进入游戏房间 - 游戏服务器,游戏服务器可以多进程同时处理,只提供游戏房间内部的游戏逻辑,
不提供其它不相干的功能
此外,大厅服务器前面放一个Nginx作为HTTP请求的反向代理,这个就不赘述。
流程规划
根据总体架构,用户从打开游戏到创建游戏并开始的过程如下:
- 用户使用微信登录大厅服务器
- 大厅服务器返回用户的一些基本信息供客户端显示
- 用户在客户端选择创建游戏房间
- 客户端发送创建请求给大厅服务器
- 大厅服务器将游戏房间的信息存储到redis上,并从可用的游戏服务器列表中返回一个给客户端
- 客户端收到创建成功的消息后,TCP连接游戏服务器开启游戏
技术和工具库
我的设想是大厅服务器业务逻辑很简单,基本就是做IO操作,因此使用python-tornado来实现,
刚好自己也比较熟悉tornado框架,开发比较快。
游戏逻辑服务器的话,本人比较喜欢异步编程,所以在网络库方面选择了boost的asio库,
不得不说boost库是个好东西,不仅有asio这样的网络库,而且也有日志库,
这样基础的一些技术定型就完毕了。
另外整个游戏服务器还依赖的一些开源组件有:
- redis,做游戏,这个还是必须的
- mysql,数据持久化,这个少不了
- nginx,反向代理,和tornado配合起来使用很酸爽
- protobuf,TCP数据传输协议,序列化和反序列化都非常快,不用自己写代码解析,很方便
- rapidjson,用来解析配置文件
后续
架构理清楚了,剩下的就是设计里面的细节了,大厅服务器没有什么好说的,
主要是游戏逻辑服务器的设计,这个下节再说~