在游戲開發中,面對游戲中的bug以及策划案子的修改,難免要重啟服務器
如果說一個服務器在游戲上線的情況下,頻繁重新服務器對用戶體驗及其惡劣,甚至會引起用戶的流失
避免游戲服務器重新啟動基本不可能,那作為游戲服務器開發人員有什么辦法能夠盡量避免這不必要的流失呢
在最近的游戲項目中本人用到了這樣一套架構,既實現了簡單的負載均衡又避免單個服務器重啟引發的一系列問題
這里就不提供具體代碼了,給大家提供下具體的開發思路吧
首先我們在腦中有這樣一個思想,突破傳統的單服務器概念
我們將服務器分成N多個進程,也就是說一台服務器由N多個進程組成,這N多個進程是N多個TCP/UDP主機地址以及端口,
可以靈活配置分布在不同物理服務器中
下面看下XML服務器設計圖
<?xml version="1.0" encoding="UTF-8"?> <servers> <server id="1" name="天上人間" version="v1.0.0 20131104" size="12" > <process id="00:16:3E:00:14:A6-9894" host="121.199.13.143" port="1860" online="4" usedMemory="57" status="101"/> <process id="00:16:3E:00:14:A6-10001" host="121.199.13.143" port="1861" online="0" usedMemory="50" status="101"/> <process id="10:dd:b1:c0:3b:82-108" host="192.168.1.102" port="1768" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-107" host="192.168.1.102" port="1767" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-103" host="192.168.1.100" port="1763" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-109" host="192.168.1.102" port="1769" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-100" host="192.168.1.100" port="1760" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-105" host="192.168.1.101" port="1765" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-106" host="192.168.1.101" port="1766" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-104" host="192.168.1.101" port="1764" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-101" host="192.168.1.100" port="1761" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:82-102" host="192.168.1.100" port="1762" online="0" usedMemory="0" status="105"/> </server> <server id="2" name="瑤池仙境" version="v1.0.0 20131104" size="10" > <process id="10:dd:b1:c0:3b:83-207" host="192.168.1.102" port="1867" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-201" host="192.168.1.100" port="1861" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-204" host="192.168.1.101" port="1864" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-206" host="192.168.1.101" port="1866" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-203" host="192.168.1.101" port="1863" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-208" host="192.168.1.102" port="1868" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-205" host="192.168.1.101" port="1865" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-209" host="192.168.1.102" port="1869" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-202" host="192.168.1.100" port="1862" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:83-200" host="192.168.1.100" port="1860" online="0" usedMemory="0" status="105"/> </server> <server id="3" name="忍者傳說" version="v1.0.0 20131104" size="11" > <process id="10:dd:b1:c0:3b:84-304" host="192.168.1.101" port="1964" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-306" host="192.168.1.102" port="1966" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-307" host="192.168.1.102" port="1967" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-300" host="192.168.1.100" port="1960" online="0" usedMemory="0" status="105"/> <process id="D4:3D:7E:BC:7B:AD-6249" host="116.226.64.2" port="1860" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-305" host="192.168.1.101" port="1965" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-308" host="192.168.1.102" port="1968" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-303" host="192.168.1.101" port="1963" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-302" host="192.168.1.100" port="1962" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-301" host="192.168.1.100" port="1961" online="0" usedMemory="0" status="105"/> <process id="10:dd:b1:c0:3b:84-309" host="192.168.1.102" port="1969" online="0" usedMemory="0" status="105"/> </server> </servers>
這僅僅是服務器的設計圖,在此之上可以再加上分區以及具體應用的設計
從上XML中可以看出有三台服務器,每個服務器下又有N多個進程,要說明的是這個列表是動態的,並不是靜態文件
當然你也只需要開發一套程序即可,但你要做的是往負載均衡服務器中推送當前進程的信息包括進程的id、
進程的主機地址以及端口、當前進程的連接數 、已經使用的內存
在每個進程啟動的時候配置下服務器的id以及當前進程的id(這里本人推薦mac地址+進程號)、
然后定時往服務器均衡服務器推送自己最新的狀態信息在負載均衡服務器中我們要能接收每個進程服務器的信息推送,
將每一條推送過來的信息存放在內存中,並設置此進程的狀態為正常狀態
也不能就一直指望這進程的推送,因為有可能此進程已經沒有在運行狀態了,所以我們需要定時掃描所有列表中的狀態,
對其主機地址端口進行連接測試,如果連不通過就將其狀態設為停止
在客戶端訪問時時候,在負載均衡需要做的就是根據連接數以及使用的內存還有狀態進行排序,
狀態正常的靠前,在線人數使用的內存比小的靠前,
根據這個思路將服務器地址列表推送給客戶端即可
當發現服務器下的每個進程連接數量都很高,我們可以在線開啟新的進程,
當有用戶進來的時候永遠連接進來的主機地址是負載最小的服務器進程,
就算某一個進程重啟了,也不必擔心服務器的正常供應。
文章轉載自 dmdq.org - 代碼大全: http://www.dmdq.org/thread-41-1-1.html
