COC总图 整个游戏架构为 << router服务器+ 游戏逻辑服务器 >>
router服务器:按玩家id索引其所在服务器
玩家逻辑服务器:游戏逻辑计算+内存+硬盘
玩家 a b c .... 若干
+-----------+ 索引 +----+ +----+ | | | ....
| router | ------> | A | | D | | | | .... 网络连接 tcp
+-----------+ +----+ +----+ +-------------------+
+----+ +----+ | 游戏逻辑 |
id - 名字 | B | | E | +-------------------+
联盟 +----+ +----+ | mnesia/ets |
服务器id +----+ +----+ |-------------------|
等级 | C | | F | | Mysql |
奖杯数 +----+ +----+ +-------------------+
<< router服务器 >> << 玩家服务器集群 >> << 逻辑服务器架构 >>
Router服务器: redis + mysql
* router服务器是整个游戏架构的核心,它需要记录游戏中所有玩家的id和其附属信息,玩家在router服务器上查询到其所在逻辑服务器的id,并用逻辑服务器id取出逻辑服务器的ip+端口信息,与其建立连接,开始玩游戏。
* router服务器的索引redis做,redis中只存储一个 {玩家id: 服务器id:}, 相信16G内存放的下,即便你有一亿用户.redis可持久化,可主从
* 服务器具体信息使用msyql存储,即使有一个个服务器,也可以按{服务器id:服务器附属信息}加载到redis.可主从,可主从则可做slave服务器预防单点故障.
* 不推荐使用hash的方法计算服务器id,因为服务器数目会增长,不方便取模,另一方面也不需要进行hash函数计算.
* router服务器记录每个玩家的id和其所在服务器id,等级,联盟,奖杯数等信息
* 提供相似度计算服务,为玩家选取实例相近的玩家.
* 存储当前玩家是否锁定的状态.锁定状态不可打.
登陆过程
* 先从router服务器登陆,验证用户信息等.router服务器需要记录玩家的账号密码,如果有的话.
* 获取其所在服务器id,可根据id实时查询其所在逻辑服务器ip和端口,
* 客户端直接与逻辑服务器通信,玩家可以开始玩游戏.
逻辑服务器
* 在玩家逻辑服务器上,玩家完成城建,造兵等逻辑计算,这些操作不设计到玩家之间交互,做法简单。
* 逻辑服务器采用mnesia作为内存cache,将活跃玩家数据全部load到mnesia中,方便快速检索;定时异步的将数据同步到mysql.
* 设置活跃度参数,mnesia定时将活跃度低的玩家从内存中清除,节省内存.
* 在逻辑服务器上查询玩家数据,先在mnesia中查,没有则从mysql中load数据到mnesia,再返回给查询客户端.
* mnesia和mysql都可做主从,可预防单点故障.
pve
* 当前玩家已通过tcp与其逻辑服务器A建立连接.
* 在router服务器上按战斗力相似度查询其所在服务器B,当然锁定玩家不在查询范围之内.
* 锁定玩家B,直接与玩家B所在服务器B通信,获取玩家完整信息状态,到服务器A.
* 服务器A将抢钱结果同步到自己,服务器A将对方玩家设置到到服务器B.
* 在线玩家不能打,不存在数据同步问题.
联盟
* 也采用router + 联盟逻辑服务器架构,与玩家架构一致.
* 在router服务器上按联盟id查询联盟所在服务器信息.
* 与联盟逻辑服务器通信完成加入,退出联盟操作,以及获取联盟列表.
架构Scale
* 整个系统同时只有一个新玩家服务器,新用户全部导入到此服务器.
* 当新用户玩家服务器达到规定人数,开启新的新用户玩家服务器.
* 也可以合服和搬服,只需要维护好route服务器上的服务器id信息即可.
单点故障
* redis、mnesia 和 mysql 均可实现分布式主从,可分别建立slave服务器,当master故障时,定向到slave.
that's all.
--
您收到此邮件是因为您订阅了 Google 网上论坛的“Erlang China”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 erlang-china...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。