一臺服務器的承載量是有限的樱衷,對于一個區(qū)來說,平時可能只需要支持500到1500人左右晶框,這樣一臺服務器可能就可以搞定,但是如果有運營搞活動两踏,打廣告拉流量,可能一個區(qū)的承載量需要支持300到6000的量兜喻,甚至更多梦染。為了適應這樣的不同情況,在游戲服務器設計的時候朴皆,最好能做到服務器可以動態(tài)擴展和收縮帕识,可以根據情況,運行不同的服務器配置遂铡。
玩家進入游戲之前就要確定進入哪個區(qū)肮疗,這個區(qū)在哪個服務器上面是由服務器端分配的。所以需要以下幾張表扒接,來存儲游戲的區(qū)信息和服務器信息
1伪货,游戲區(qū)信息表
分區(qū)ID,分區(qū)名字钾怔,分區(qū)狀態(tài)(主要是:新區(qū)超歌,熱門,活躍蒂教,維護等)
2,游戲區(qū)對應的服務器表
分區(qū)ID脆荷,服務器Id凝垛,服務器ip,服務器端口蜓谋,服務器狀態(tài)(正常梦皮,不可用等),當前在線人數(在分配服務器做為參考值)桃焕,權重值
第二張表是一個一對多的關系剑肯,一個區(qū)對應多個服務器地址,當用戶選擇某一個區(qū)之后观堂,向服務器請求獲取這個區(qū)所在的服務器地址让网。這時,服務器可能根據當前區(qū)所對應的服務器的在線人數或者其它條件师痕,按照一定的算法溃睹,給當前玩家分配一個可以連接的服務器地址,返回它的ip和端口胰坟。這樣就可以實現服務器的動態(tài)擴展了因篇,當一個區(qū)需要增加承載量時,只需要給這個區(qū)增加服務器數量即可。當流量減少竞滓,穩(wěn)定之后咐吼,可以減少服務器數量。
分配服務器地址的算法一般有以下幾種:
1商佑,用戶id求余法
假如當前一區(qū)對應著6臺服務器锯茄,當用戶選擇一區(qū)時,可以根據用戶的id和服務器數量求余莉御,比如serverIdIndex = userId % 6撇吞,serverIndex的值是0到5之間的某個值。這個算法可以讓同一臺用戶使用分配到同一臺服務器上面礁叔。
2牍颈,加權隨機法
假如當前有一區(qū)對應3臺服務器A,B,C,它們有一個權重的屬性琅关,A(1)煮岁,B(3),C(4)涣易,可以這樣計算:
代碼請到此查看画机,簡書的編輯器對代碼支持太差了:http://www.coc88.com/h-nd-166.html?_np=2_323?
3,輪詢法
這個是按照請求順序新症,比如一個區(qū)對應3臺服務器A步氏,B,C徒爹,第一個用戶請求時分配A,第二個用戶分配B荚醒,第三個用戶給C,每四個用戶再給A隆嗅,如果循環(huán)下去界阁。
4,最小在線人數
這個應該是最精確的胖喳,不過需要統(tǒng)計每個服務器的在線人數泡躯,每次用戶請求分配服務器時,遍歷服務器列表丽焊,把最小在線人數的服務器地址分配給這個用戶较剃。
如果游戲服務器沒有網關,以上方案可以直接使用技健,如果游戲服務器有一層網關重付,需要添加網關的信息,分配給用戶的連接地址就是網關的地址凫乖,一個區(qū)可能對應著一個網關确垫,一個網關對應多個服務器弓颈,確定網關之后,再確定網關之后哪個服務器處理業(yè)務消息删掀,需要給客戶端再分配一個服務器ID翔冀,網關根據服務器的ID轉發(fā)客戶端的請求。
在實際應用可披泪,可能會有更多的條件加入進來纤子,以確定用戶連接到哪個服務器,比如服務器是否在維護狀態(tài)款票,人數是否過多等等控硼,所以要根據實際情況選擇和設計。