感觉大家的架构做的都相当不错,学习了!2013/3/7 Lihe Wang <wanglihe....@gmail.com>虽然没玩过那款游戏,但是整体上的思路看了一下。我觉得这个设计可能有问题:1、登录过程有没有可能成为颈?目前架构是单点验证,这其实不是erlang的思想。2、只考虑新人和加服务器,那么活跃度降低,退出登录的客户是不是了要占着资源呢?这可能没有达到最佳利用率。在 2013年3月6日下午9:43,卓 一抗 <zhuoy...@nibirutech.com>写道:
hi,大家好,最近在玩一款叫做<<clash of clans>>的slg手游,因为此游戏做的非常好,所以作为一名erlang开发者,不禁开始想象它的服务器应该怎样做。下面是我的一点想法,欢迎交流讨论.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。
--
您收到此邮件是因为您订阅了 Google 网上论坛的“Erlang China”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 erlang-china...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
--
您收到此邮件是因为您订阅了 Google 网上论坛的“Erlang China”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 erlang-china...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。