棋牌游戏服务器开发(1)

由于公司业务扩展,CEO打算开发一个房卡模式的棋牌游戏,正好本人对游戏服务器也很感兴趣,
所以就接下这个任务,打算自己从0开始用C++开发一个棋牌游戏服务器。

总体架构

之前在开发一个老虎机服务器的时候就吃过过度设计的亏,因此在这次的设计时,我的原则是,
尽可能简单,但是又要保证以下两点:

  • 服务器能够实现动态扩容,也就是用户量增长到一定程度时可以横向扩展服务器的负载
  • 服务器在出现故障或者被攻击的时候可以下线,尽量可以做到游戏转移(后面发现转移比较复杂,先搁置…)

根据上面的核心原则,我设计了一个简单的架构:

  • 大厅服务器,使用restfulAPI的方式提供服务,功能:用户查看自己的历史战绩、查看自己的房卡数目、
    创建游戏房间、进入游戏房间
  • 游戏服务器,游戏服务器可以多进程同时处理,只提供游戏房间内部的游戏逻辑,
    不提供其它不相干的功能

此外,大厅服务器前面放一个Nginx作为HTTP请求的反向代理,这个就不赘述。

流程规划

根据总体架构,用户从打开游戏到创建游戏并开始的过程如下:

  1. 用户使用微信登录大厅服务器
  2. 大厅服务器返回用户的一些基本信息供客户端显示
  3. 用户在客户端选择创建游戏房间
  4. 客户端发送创建请求给大厅服务器
  5. 大厅服务器将游戏房间的信息存储到redis上,并从可用的游戏服务器列表中返回一个给客户端
  6. 客户端收到创建成功的消息后,TCP连接游戏服务器开启游戏

技术和工具库

我的设想是大厅服务器业务逻辑很简单,基本就是做IO操作,因此使用python-tornado来实现,
刚好自己也比较熟悉tornado框架,开发比较快。

游戏逻辑服务器的话,本人比较喜欢异步编程,所以在网络库方面选择了boost的asio库,
不得不说boost库是个好东西,不仅有asio这样的网络库,而且也有日志库,
这样基础的一些技术定型就完毕了。

另外整个游戏服务器还依赖的一些开源组件有:

  1. redis,做游戏,这个还是必须的
  2. mysql,数据持久化,这个少不了
  3. nginx,反向代理,和tornado配合起来使用很酸爽
  4. protobuf,TCP数据传输协议,序列化和反序列化都非常快,不用自己写代码解析,很方便
  5. rapidjson,用来解析配置文件

后续

架构理清楚了,剩下的就是设计里面的细节了,大厅服务器没有什么好说的,
主要是游戏逻辑服务器的设计,这个下节再说~