coc游戏服务器架构分析



coc中的功能,大致分为以下几个部分
1.登陆
2.部落相关功能
3.聊天(“世界"聊天,部落内部聊天)
4.邮件
5.搜索对战玩家
6.排行榜


从需求上来出发,由于是全球同服,所以服务器端可以用传统的社区类flash游戏架构,假设采用的是长连接(短连接思路架构大致相同)
1.登陆:
  传统滚服类游戏的登陆模式是,客户端本地配置所有服务器的ip与port信息(或是从网关服务器获取服务器信息),玩家选择对应服务器,然后客户端与之连接通信,每一个游戏服务器直连一个数据库,
  一个游戏服务器就是一个游戏的世界
  社区类游戏的登陆模式是,客户端通过hash算法得到其所在服务器id,然后去网关服务器中获取对应游戏服务器信息,(假设我们后台有n组游戏服务器分别用s0~s(n-1)来代替),
  在与服务器通信时hash自己的用户名(hash算法可以使用魔兽的hash算法),
  获得hash值,由于用户名每个玩家总是不同,所以此hash值可以认为是全局唯一,可以当做玩家id,用得到的hash值除以n取余,再得到一个值v,这个值v就是此玩家所在服务器的编号,如hash后的
  值为56547,游戏服务器有10组,依次编号为s1~s10,取余后得到7,那么此玩家就在s7服上,然后从客户端本地读出s7服的ip与port,与之连接,获取玩家数据,连接后,玩家的数据更改也由此
  服务器处理


  架构如下
                               client
                                  |     \
                                  |    gate_server 
                                  |     /
   ---------------------------------------------------------
   |                  |                |
server1            server2           server3             .....
   |                  |                |
  db1                db2              db3


2.部落相关功能
   部落信息的存放与获取与玩家信息类似,通过hash(部落名)%部落服务器数量,获取部落所在部落服务器id,然后从此服务器获取部落信息


3.聊天
   “世界”聊天
   coc中的世界聊天每个国家是不在一起的,并且一个国家中也分多组聊天服,有时有我和同事一起在世界中说话,但彼此互相无法看到,对于此种聊天的架构,可以有多种可能,具体视需求来定,
   在这里假设是每个国家有多条聊天线路,不同聊天线路中的玩家互相不可见
   原理同登陆流程,具体实现逻辑如下
   1.聊天服务器在启动时注册自己(所在国家,服务器id)到网关服务器中
   2.玩家在登陆时跟据其登陆ip获取其所在国家,跟据其所在国家和用户名去网关服务中获取应该连接的聊天服务器
   3.聊天网关服务器收到消息后hash用户名,取余得到其对应的聊天服务器id,
   4.把此聊天服务器的信息发送给客户端


   架构如下
                                client
                                  |     \
                                  |    gate_server 
                                  |     /
   ---------------------------------------------------------
   |                  |                |
chat_server1      chat_server2     chat_server3             .....


   部落内部聊天
   由于部落中玩家数量并不多,所以个人认为没有必要再分离出单独的部落聊天服务器,直接由部落服务器处理就可以了
   1.客户端把聊天内容发给其部落所在服务器,部落服务器收到后获取其部落中所有玩家名,hash(名)%游戏服务器数量后获取每个玩家所在服务器信息,然后向其发送聊天消息,由对应服务器再
   向每个客户端发送聊天信息


4.邮件
   与玩家信息类似


5.搜索对战玩家
   游戏服务器中配置所有搜索服务器的ip与port信息,同样hash取余后获取每个玩家对应的搜索服务器id,与之连接,搜索流程如下
   1.客户端向游戏服中发搜索消息
   2.游戏服向搜索服务器发搜索消息
   3.搜索服务器收到消息后随机一个游戏服务器向其发消息
   4.游戏服务器收到消息后,随机一个可攻击的目标玩家,把玩家的名子返回给搜索服务器
   5.搜索服务器把玩家名返回游戏服务器
   6.游戏服务器hash(目标玩家名)取余后得到目标玩家所在服务器
   7.游戏服务器向目标玩家所在服务器发消息获取目标玩家信息
   8.游戏服务器把目标玩家信息返回给客户端


6.排行榜
  关于排行榜的做法,可以参考云风在陌陌争霸中的思路,地址:http://blog.codingnow.com/2014/03/mmzb_db_2.html




统上来看,最后服务器的架构是这样子的


          client1              client2   ...
             |   \             /    |
             |   gate_server...     |
    |                      |
         chat_server1         chat_server2     ...
         mail_server1         mail_server2     ...
         clan_server1         clan_server2     ...
game_server1 ------- game_server2     ...
          /  |   \             /    |   \
        db1  |     rank_server      |   db2
             \                      /
     \                    /
                   serch_server  ...


     注:...表示此类型服务器为服务器群组




优化:
1.hash后获取所在服务器信息的过程,可以采用一致性hash算法来做,尽量减少服务器数量变更带来的数据动荡
2.所有服务器的信息不要配在客户端,添加一组网关服务器用于客户端获取游戏服务器信息和聊天服务器和搜索服务器信息等,以便于动态添加删除服务器时,客户端可以动态适应
3.添加搜索中心服务器,用于保存所有搜索服务器信息,这样方便动态添加删除搜索服务器
4.上诉架构中还有是一些不太满意的地方,比如所有中心服务器有可能会成为热点,当出现此种情况时,只能停服然后手动添加更多的中心服务器,但是否会成为热点,还有待实际测试


结语:
以上纯yy,有更好的思路后再来更新



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值