大纲
- 全区全服架构基础
- 全民飞机大战PK系统的分布式设计方案
全区全服架构
全区全服架构是通过一组相同的游戏逻辑进程提供对外服务。客户端通过负载均衡策略如TGW接入后台 任一游戏逻辑进程, 对于玩家而言,这一过程是透明的,玩家并不会感觉到这次连接和上次连接的进程有什么不同,所有的玩家相当于在同一个大区里面进行游戏。另外,玩家自身其实并不关心自己在哪台服务器上。
全区全服的特点主要有:承载能力强,资源利用率高,扩容方便,容灾能力强,运营维护方便。
由于采用了负载均衡策略,所有的游戏逻辑进程可以均衡地分摊整个游戏的压力。扩容方便表现在只需要简单地增加游戏逻辑进程的数量就可以达到扩容目的,甚至可以进行不停机的在线扩容。如果有少量游戏逻辑进程出现问题的话,通过客户端的自动重连机制,玩家可以无感知地切换到正常的进程上继续游戏。由于进程种类比较少,部署拓扑网络比较简单。
PK系统
PK系统主要分为两种:好友PK和世界PK。PK倾向于一种友好比赛的性质,好友PK通过选择一个好友,而世界PK则是通过系统匹配一个合适的对手。然后双方同时进入游戏,最后根据比赛的结果来决定胜负。
世界PK匹配系统的设计
常规PK匹配系统的设计方案
在这个方案中需要设计一个专门用于PK的服务器,所有PK操作通过游戏逻辑进程到PK服务器进行操作。
常规PK匹配系统设计方案的缺点
- 独立的PK服务器进程,异步过程多且复杂。
- PK服务器需要考虑负载分担、容灾和备份。当有多台PK服务器且人数不足的情况下,可能会导致体验的下降。
- 独立进程下对角色PK数据的管理复杂,需要考虑CACHE机制。还需要考虑缓存的更新、淘汰 ,以及多个PK进程之间的数据冲突。
- 开发和部署比较复杂
分布式PK系统设计方案
- 事件PK报名数据是直接存储在游戏逻辑进程内的,这一点和传统方式是不同的。
- 世界PK的匹配算法是分布运行在逻辑进程和PK服务器上的。
- PK服务器除了执行匹配算法之外没有其它任何的逻辑。而和PK相关的其它逻辑都在游戏进程之内完成。
- PK服务器不存储数据,所以也没有状态。
- 游戏逻辑进程对于PK服务器是没有依赖性的,所以对于故障也不敏感。
分布式世界PK的匹配算法
匹配算法分为两个部分,分别运行在游戏逻辑进程和PK服务器进程内,运行在游戏逻辑进程内的算法部分,执行一个本地对于报名数据的快速匹配,这一过程会短路掉大部分的PK请求。而运行在PK服务器内的算法会定期向各个游戏进程请求报名数据。根据特定的筛选规则,游戏逻辑进程间会将暂时没有匹配成功的数据筛选一部分上传到PK服务器。在PK服务器搜索这些数据之后会执行一个相同的匹配算法,并且将结果返回给游戏逻辑进程。而其后所有的操作都会在游戏逻辑进程内部进行。仔细思考会发现,这个匹配算法是一种二级执行,第一级是游戏逻辑进程内的匹配,在第一级匹配随着参与人数的增长,第一级匹配效率会越来越高,所以到了第二级匹配的人数会比较固定,不会随着负载的增加而增加。
另一个特点是PK服务器提供的时候一种主动式的服务,因此游戏逻辑进程对它是没有依赖性的,而PK服务器本身也不存储数据和状态,所以它对故障是不敏感的。即使出现了故障之后也很容易恢复。
上图横坐标是参与PK人数的增长,纵坐标是PK服务器上匹配的数据。随着参与PK人数的增加,PK服务器内进行匹配的人不会一直增加,会趋向于一个恒定的值。
分布式PK系统的特点
- 匹配算法的二级分层设计,将主要负载控制在游戏逻辑进程内。
- 充分利用游戏逻辑进程的天然分布式,达到负载均衡的目的。
- 通过报名数据的智能分级和筛选,达到匹配效果的最大化。
- PK服务器进程的无状态设计,对故障不敏感,对其他进程无依赖。
- PK服务器进程的主动式服务设计,采用了逆向的思维方式,换个角度去思考问题,达到了意想不到的效果。