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