青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-4  評論-40  文章-117  trackbacks-0


轉載自http://www.libing.net.cn/post/Cluster-Game-Server-development.php


 

 

 

自從2003年開發VOIP Radius Server以及修改Gnugk依賴,從事服務器開發已經近五年了,對服務器開發也有一些自己獨到的看法以及見解。當擺脫了技術本身的束縛之后,才理解重要的并不是某種技術的運用,而是整體設計的考慮,也慢慢明白了設計是開發的靈魂的道理。

從技術層面來看,各個平臺都有一些自己特有的東西,比如Windows 平臺下面的IOCP技術,可以說為了支持大的并發,IOCP是一個Windows平臺的必選方案。而在Linux下面Epoll又是所有開發人員需要掌握的技術。當然還有FreeBSD下面Kqueue的應用了。一些其他平臺也有自己獨有的AIO庫。

隨著網絡開發的進一步理念加深,跨平臺庫也吸引了越來越多的使用者的眼光。比如行業里面最出名的莫過于ACEASIO(Boost公司)兩大支持庫。新的版本中都對IOCP支持,使用的是Proactor設計模式實現的。

當我們擁有了以上的知識背景后,我們就可以開始著手設計了。而這僅僅是一個必要條件,而不是重復條件。為什么呢?

我們先來提一下集群式服務器開發的常用幾個技術知識。

1:線程                    

2:線程池

3:內存池

4:數據庫連接池

5:為了達到1:10000的連接,可以采用Server-Client的連接方式,而為了達到1:10000*100的連接,我們怎么辦呢?一般會采用Client-> ConnServer -> LogicServer。這是技術背景。ConnServer在接受完Client 的連接后,將Logic Server 暴露給Client,并立刻斷開連接。以后的數據交互就和Conn Server沒有關系了,這種架構有很多的優勢。

[圖一:標準集群GameServer架構方案]

首先要說的是線程,在服務器開發中,線程是一個非常重要的概念,尤其是現在多核服務器的發展。當然,提到了線程自然應該說到線程之間的互斥。這也是服務器開發者們在開發最初最容易出現的問題。體現在一個資源或者多個資源在多個線程中共享使用如何避免出現臟數據的問題。

       線程池,池,顧名思義,是一個存儲容器,一個淺顯的比方,我們把水事先存放在水池里面,當我們需要的時候,就去里面取,用完了就還給池(其實這里并不是非常合適的例子,畢竟我們用完了水是丟掉)。這是一個由多個線程組成的一個隊列,當有事情發生時候,我們把當前的空閑的線程丟給他,為他服務。當下一個事件發生的時候,我們又從池里面取一個空閑的線程丟給他,為他服務。當服務完畢,把線程丟回池中。起到反復利用的目的。

       內存池,同樣也是一個池。這個概念的產生是為了避免服務器頻繁的分配內存,而采取預先分配一定數目的對象,并將對象們放到隊列中,當需要的時候,從該隊列中取出,當用完,就返回池中。比如我們的Server可能會存在10000個連接,我們預先開辟10000Client對象,存儲在list<Client *> pFreeClientsList中,當需要的時候,從隊列中pop一個出來,當使用完畢就丟回pFreeClientsList。這種機制很好的起到了避免頻繁開辟內存對象的目的,可以很好的提高系統的性能。

       數據庫連接池,同上面一致的道理,在服務器中,數據庫訪問也是一個很大的瓶頸,所以同樣采取上面的道理,使用連接池的概念。當然在數據庫連接方面也有一個特殊的問題存在。就是數據庫的連接不宜過多,所以傳統的來一個處理,就開一個連接是不合理的,必須采用控制適當的連接次數。

       當然另外一些需要提到的是內存數據庫。硬盤的訪問速度和內存的訪問速度不是一個數量級的,而且隨著內存的硬件價格越來越低,內存數據庫的可行性也越來越高,尤其是實時性要求高的系統,完全可以采用內存數據庫和物理數據庫想結合的方法來處理。

       當系統的連接數量從萬上百萬級別的時候,服務器程序就超越了服務器本身,我們需要考慮的問題將從一下幾個方面開展:

       1:如何劃分系統中功能?

       2:如何保證整個系統的性能可控,直觀的說就是系統每一步時候瓶頸在哪里?

       3:如何保證當系統的瓶頸凸顯時候,簡單的添加一組服務器,就可以達到分壓目的?

       4:系統的災難部分出現的時候,如何保證系統依然可以完整運行?

第一個問題是如何劃分系統中的功能。在軟件開發中,我們追求的是每個函數功能盡量簡單,易學里面的道理叫做大道至簡。軟件開發中同樣適用,在服務器開發中,同樣適用。如何將整個系統中的需求抽象為功能,并如何更好的劃分功能,將極大減少系統開發的難度,并能夠使得系統的可擴展性非常強。

第二個問題是瓶頸問題。從物理上面來分析,性能在硬盤,內存,CPU是三個決定因素的地方。而從軟件的角度就包含了數據庫系統,操作系統,服務器軟件系統三個方面,更細節方面拿游戲服務器來說,Conn Server 的壓力,Logic Server的壓力,還是DB Server的壓力了。

第三個問題還體現在分組方面。比如當Conn Server出現壓力的時候,如何簡單的添加一個Conn Server就達到分壓目的。當Logic Server出現壓力,或者DB Server出現壓力。另外就是如果服務器設計以組的方式出現,應該如何管理組以達到分壓目的。

第四個問題是災難恢復。在重要的系統中,由于涉及到的系統、硬件、軟件非常多,很容易某個系統出現故障,這個時候,系統應該具有很好的伸縮性,故障出現后,系統必須依然運行順利。

       所以在設計服務器時候,應該考慮上面的因素。下面我提出在集群服務器開發中的兩種可行的方案。



[圖二:基于功能劃分的集群GameServer架構]

 

[圖三:組劃分的集群服務器架構]

 

在圖二中,系統按照功能方式劃分系統,當壓力增加的時候,按照功能方式添加某服務器,可以簡單的達到分壓的目的。在Conn Server中保存所有有效Hall Server的連接,以及當前該Hall Server的當前連接數。代碼示意如下:

class THallServer 

{

public:

       THallServer();

       virtual ~THallServer();

       THallServer(int port);

 

public:

       SOCKET _hallServer; //保持同HallServer連接的Socket對象

       int _maxConn; //HallServer的最大連接數量

       int _currentConn; //當前連接數量

       int GetCurrentConn();

       char _hallServerAddr[32];

       int _hallServerPort;

 

};

 

class THallServerList 

{

public:

       THallServerList();

       virtual ~THallServerList();

      

public:

       list<THallServer *> pHallServerList;

       SOCKET _listenHallServer;

       HANDLE ListenThread;

 

public:

       void Start();

       THallServerList(int port);

       //Accept線程

       static unsigned __stdcall ListenThreadFunc(LPVOID lpVoid);

};

 

上面的代碼是該設計方案的類代碼。從代碼中我們可以理解出思想如下:

       Conn Server里面存在一個THallServerList對象,該對象監聽端口,當有HallServer連接過來,將該HallServer存入隊列,并實時獲取該Server當前的壓力情況,可以起到一個負載均衡的作用。而保持的HallServer隊列,當客戶端連接過來,Conn Server則從pHallServerList中將當前currentConn最小的服務器發送給客戶端,以后客戶端將同該Hall Server發起連接。

       在該系統中,當我們的Conn Server不夠的時候,可以考慮架設多臺Conn Server,當客戶端無法連接時候,程序自動連接下一臺Conn Server.比如conn1.doserver.netconn2.doserver.netconn3.doserver.netconnn.doserver.net

 

       圖三中是按照組劃分的系統組成。該方案目前來說,我還并沒有實施過,只是在方案上面進行過探討。希望有時間我可以設計一個案例出來再做展示。



[圖四:改進的功能劃分集群GameServer架構二]

在項目的實施過程中,我發現了Hall Server其實并不需要同Logic Server進行交互,如果Hall Server在保留同Client1W多連接的情況下依然保持過多的同Logic Server的連接,勢必壓力非常大,這時候如果在之間使用ISServer來交互,就可以減少很多的連接數量,也使得系統更加清晰。

       Hall Server只需要獲取所有的Logic Server的名稱,Logic Server的地址,Logic Server的端口,以及當前的連接數量。所以通過之間的一個信息服務器作為橋梁,就可以很好的解決這個問題。這種架構就可以達到非常完美的解決上面提到的4個難點的問題了。

      

后記:封閉開發之余,很想把自己的在服務器開發的經驗分享一下,所以就借用了2個小時整理此小文,希望大家喜歡。同時歡迎大家指點,建議。也歡迎轉載,但是無比保留版權以及原作者信息。非常感謝。

 

                                                                                           胡章優 2008-12-3 于北京

 

作者:胡章優,吉林大學機械學院教師。長春優狐科技開發有限公司董事長兼總經理。

Tel: 13596199043

Mail: huzhangyou2002@gmail.com (huzhangyou@jlu.edu.cn)

Site: http://doserver.net

MSN:huzhangyou2002@gmail.com

QQ: 3803308


posted on 2009-03-05 12:39 李陽 閱讀(2108) 評論(0)  編輯 收藏 引用 所屬分類: 游戲開發
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美人成在线| 欧美一区二区免费| 欧美日本免费| 久久久综合精品| 亚洲国产成人精品久久久国产成人一区 | 久久久久久91香蕉国产| 久久激情视频久久| 亚洲精品在线观看免费| 午夜伦理片一区| 怡红院精品视频| 欧美精品成人| 亚洲欧美精品在线观看| 亚洲国产91精品在线观看| 亚洲人www| 久热精品视频在线| 亚洲在线视频网站| 久久乐国产精品| 欧美日本国产视频| 国产精品美女主播| 欧美国产精品中文字幕| 欧美一区二区女人| 免费欧美电影| 久久精品视频免费| 午夜精品视频在线观看| 一区二区三区高清视频在线观看| 欧美aⅴ一区二区三区视频| 亚洲欧美视频在线观看| 久久躁狠狠躁夜夜爽| 久久九九国产精品怡红院| 一区二区三区视频在线观看| 在线观看欧美一区| 宅男66日本亚洲欧美视频| 麻豆成人精品| 亚洲综合精品四区| 欧美激情视频一区二区三区不卡| 国产精品网站视频| 国产精品夜夜夜| 亚洲三级视频| 在线一区二区三区四区| 欧美成人第一页| 午夜欧美大片免费观看 | 在线综合亚洲| 艳妇臀荡乳欲伦亚洲一区| 亚洲高清在线观看一区| 先锋影音国产一区| 国产精品黄色| 国产一区二区三区奇米久涩| 国产精品爽爽ⅴa在线观看| 亚洲人成在线播放| 一区二区三区av| 亚洲国产专区| 一区二区三区精品久久久| 牛牛影视久久网| 91久久夜色精品国产网站| 欧美高清成人| 日韩视频欧美视频| 午夜久久美女| 国产一级久久| 久久综合国产精品| 久久精品一区二区| 亚洲电影自拍| 亚洲素人一区二区| 久久精品国产第一区二区三区| 久久亚洲欧美国产精品乐播| 欧美一区二区三区日韩| 国外视频精品毛片| 亚洲主播在线观看| 亚洲一级网站| 女人天堂亚洲aⅴ在线观看| 亚洲国产高清在线观看视频| 美女亚洲精品| 韩日视频一区| 亚洲日韩欧美视频| 亚洲国产精品t66y| 欧美久久精品午夜青青大伊人| 亚洲欧洲在线一区| 亚洲每日更新| 国产乱理伦片在线观看夜一区 | 国产一区二区丝袜高跟鞋图片 | 韩日精品在线| 亚洲第一综合天堂另类专| 欧美精品午夜视频| 欧美一乱一性一交一视频| 欧美激情国产日韩| 亚洲新中文字幕| 国产伊人精品| 亚洲欧美在线一区二区| 性欧美精品高清| 亚洲高清视频一区| av成人手机在线| 国内自拍一区| 亚洲精品欧美一区二区三区| 国产精品自拍视频| 欧美国产日韩一二三区| 国产精品久久久久久久久搜平片| 久久亚洲欧美| 国产精品你懂的在线欣赏| 欧美 亚欧 日韩视频在线| 国产精品a级| 一级日韩一区在线观看| 蜜臀av国产精品久久久久| 欧美日本簧片| 久久综合给合久久狠狠狠97色69| 欧美日韩综合在线| 亚洲精品专区| 亚洲国产成人一区| 国产欧美日韩在线播放| 亚洲中字黄色| 男人插女人欧美| 久久激情视频| 国产精品v片在线观看不卡| 欧美不卡一区| 国产一区二区三区四区在线观看 | 99ri日韩精品视频| 亚洲国产精品久久91精品| 西西人体一区二区| 亚洲一区二区三区免费视频| 亚洲精品欧美极品| 亚洲国产精品一区二区尤物区| 在线视频欧美日韩精品| 亚洲美女精品久久| 欧美国产精品一区| 欧美黄色日本| 亚洲国产精品久久久久婷婷老年 | 欧美日韩一区不卡| 亚洲日本激情| 久久久久久久久久久久久女国产乱 | 欧美成人免费小视频| 国产欧美精品一区| 亚洲视频在线看| 亚洲一区二区三区在线看| 欧美人与禽猛交乱配视频| 亚洲国产精品一区二区第四页av | 久久成人精品电影| 久久国产精品久久久| 亚洲综合三区| 国产精品国产三级国产aⅴ9色 | 欧美成人中文| 亚洲夜间福利| 欧美三区不卡| 一区二区三区视频在线| 亚洲女优在线| 美女图片一区二区| 一区二区三区日韩在线观看| 欧美激情第五页| 日韩一级精品视频在线观看| 在线性视频日韩欧美| 国产精品久久久久久户外露出 | 亚洲一二三级电影| 国产精品日韩二区| 欧美一区二区视频在线观看2020| 久久精品99久久香蕉国产色戒| 国产色产综合产在线视频| 亚洲国产精品久久久久| 亚洲久久视频| 国产精品久久久久9999| 午夜视频在线观看一区二区| 久久久水蜜桃av免费网站| 亚洲高清视频一区二区| 欧美日韩亚洲系列| 午夜一区二区三区不卡视频| 久久久人成影片一区二区三区| 亚洲第一页中文字幕| 亚洲欧美一区二区三区在线| 亚洲黄色三级| 欧美一区二区免费| 美女网站久久| 亚洲午夜av电影| 狠狠色综合一区二区| 欧美精品久久天天躁| 亚洲欧美日韩成人| 欧美成人在线网站| 欧美亚洲视频一区二区| 欧美日韩国产123| 欧美成人一区二区三区片免费| 亚洲人午夜精品免费| 国产精品乱码| 美国十次了思思久久精品导航| 欧美激情一区二区三区蜜桃视频 | 亚洲欧美激情四射在线日| 美日韩免费视频| 亚洲欧美激情在线视频| 亚洲黄一区二区| 国产亚洲欧美日韩精品| 欧美日韩高清不卡| 久久av资源网站| 久久久久久亚洲综合影院红桃 | 猫咪成人在线观看| 亚洲欧美bt| 99精品国产福利在线观看免费| 久久偷看各类wc女厕嘘嘘偷窃| 久久精品国产999大香线蕉| 亚洲精品乱码久久久久久蜜桃91| 国产精品推荐精品| 欧美日韩一区免费| 欧美精品v日韩精品v韩国精品v | 国产精品久久久免费 | 亚洲国产成人av好男人在线观看| 国产精品日韩欧美一区| 欧美日本韩国在线|