棋牌游戏架构设计

游戏服务器设计

一、总体设计,如下拓扑图

棋牌游戏架构设计

机器:
一台腾讯云redis服务器(主从结构),一台腾讯云mysql服务器(主从结构),一台游戏服务器,两台网关服务器(暂时只有一台,后面再增加)

模块:

网关服务器:网关服务模块,通知模块

游戏服务器:游戏逻辑处理,redis操作模块,通知模块,异步更新数据模块,任务模块,redis数据维护模块

二、名词解释

1、客户端:安装在手机或各种其他设备上的本游戏

2、网关:起到中转作用的服务器,客户端直接连接网关

3、游戏服务器:运行游戏逻辑的服务器

三、登录服务器及网关

这两个放在一台物理机上,可以有多台,多台部署的是一样的代码

1、登录服务器和网关放在一台物理机器上,管理后台、数据分析系统等也放在放一起

2、登录服务器采用php编写的web服务端,采用nginx负载均衡,把请求均衡到各个网关服务器

前期只采用一台网关,等到网关被攻击瘫痪,在开启新的网关

3、登录服务器会从redis读取启用的游戏(网关服务和游戏服务器共同维护一个全局在线游戏及在线用户的数据,数据存储在redis中,后面的存储方案有详细说明)

四、网关及游戏服务器

1、通讯方式:websocket,游戏服务器主动连接网关

2、存储方案:

1、网关维护一份当前启用的游戏,存储在redis中,采用hash结构,key:gateway:online:games:(game_id),value:(game_id,game_server_ip,game_server_port,online_total,每个房间的在线数量),游戏服务器连接到网关之后,网关记录启用的游戏到redis中,登录服务器在用户登录的时候,需要从这里读取启用的游戏列表。

2、网关和游戏服务器共同维护一份在线玩家数据,采用hash结构,key:gateway:online:users:(uid),value:(uid,game_id,room_id,game_status,start_time,online_time_num,end_time,等其他各种字段),玩家加入房间成功,由游戏服务器设置在线数据,玩家退出游戏由游戏服务器更新数据,玩家断线,由网关更新在线时长。

3、玩家在游戏中的各种行为,由游戏服务器保存在进程内存,玩家账户变更,由游戏服务器直接更新redis中的用户数据,玩家金币变更,由游戏服务器中的异步更新模块负责更新,并同步到客户端

3、用户断线:网关捕获到用户断线,直接通知游戏服务器进行相应逻辑处理,并更新共同维护的redis中的数据。

4、网关断线:游戏服务器捕获到网关断线,对于炸金花,欢乐斗牛这种超时自动弃牌的游戏,游戏服务器需要设置当前游戏中的所有玩家断线,对于斗地主这种超时服务器自动托管的,不做操作,当游戏结束,30秒不准备,会自动踢人,并更新共同维护的redis数据。

5、网关服务器启动:当玩家重新连接网关,检查用户是否在游戏中,在?立即返回:不作操作。

6、游戏服务器断线:网关捕获到游戏服务器断线,从redis中删除在线游戏数据,并通知所有在断线游戏中的玩家,游戏断线,返回大厅,并删除用户在线数据中的游戏字段。

7、游戏服务器启动:启动之后,连接网关服务器,网关服务器注册游戏数据,保存在redis中。

五、世界消息通知、管理后台发送来的通知等

1、游戏中的世界消息通知,统一由网关处理,并发送到本网关中的所有用户。

2、管理后台发送来的通知,例如:玩家充值、自动广播等,直接发送到网关提供的一个http服务接口,由网关统一发送给本网关中的所有用户。

3、游戏中的通知,例如:游戏结算通知等,这类型的通知属于世界广播,直接游戏中的通知模块处理之后,发送到网关,网关在发送到各个客户端。

六、redis和mysql

1、redis负责缓存,redis中的数据是最新的,一般来说比mysql中的新,例如在用户登录游戏之后,用户的所有数据都以redis中的为准,redis中的数据定时同步到mysql中,同步有游戏服务器中的模块同步,一般5分钟同步一次所有变更的用户的数据。

2、redis启用RDB快照,定时同步数据到硬盘。

七、游戏服务器说明

1、每个游戏服务器相当于一个模块,运行一个进程,在启动的时候会连接网关.

2、游戏服务器包括:游戏逻辑处理模块,redis数据获取模块,通知模块,异步更新用户数据模块,其他redis数据获取模块。

八、任务模块

1、任务模块和游戏服务器放在同一台服务器上,任务模块作为游戏服务器的一个模块任务服务器负责处理各种任务,并通知到网关。

九、网关维护游戏服务器数据、用户连接以及与服务器的绑定关系等

1、游戏服务器连接网关,网关需要维护一份连接(ws/game_id/game_server_ip/game_server_port/user_num)。

2、用户连接游戏服务器,维护一个用户连接数据(ws,uid,game_id,room_id),用户加入游戏房间,需要绑定用户数据(game_server_id),通过game_server_id,路由用户后续请求数据到游戏服务器。

3、用户断线删除用户数据,游戏服务器断线,删除游戏服务器数据

十、游戏服务器用户账户维护

1、提供一个用户账户数据缓存模块,用户加入房间把用户账户数据写到缓存模块,用户后续在游戏中的操作,用户**,都按照缓存模块的数据,通知也按照这个,牌局结算,结算之后,统一修改redis,并同步一份数据到缓存模块,游戏内的用户账户变更,通过缓存模块获取,结算之后的通知也是,其他管理后台发送的,通过网关读取redis中的数据更新

十一、游戏设计

1、一般场:初级场、中级场、高级场、土豪场

2、万人场:万人场和一般场的游戏ID一样,只是房间不一样,万人场一个牌桌支持100人,超过,新开牌桌

3、私人场:私人场和一般场游戏ID一样,只是房间不一样,私人场一个牌桌的人数和一般场一样

以上三种场在服务器按照三个模块,互不干涉