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