• <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>

            twzheng's cppblog

            『站在風(fēng)口浪尖緊握住鼠標(biāo)旋轉(zhuǎn)!』 http://www.cnblogs.com/twzheng

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              136 隨筆 :: 78 文章 :: 353 評(píng)論 :: 0 Trackbacks
            [源] http://zhuweisky.cnblogs.com/archive/2006/03/16/351426.html

            上文已經(jīng)講到,Tcp連接池管理器為我們的應(yīng)用進(jìn)行了很多復(fù)雜的管理,比如功能服務(wù)器的調(diào)度(實(shí)現(xiàn)FS的負(fù)載均衡)、連接池的動(dòng)態(tài)添加/移除、控制每個(gè)連接池的相關(guān)參數(shù)在UI上的顯示等,并且連接池管理器與單個(gè)連接池?fù)碛幸粯拥慕涌?/span>ITcpPool。我們先回顧一下這個(gè)接口:
             
             1     public interface ITcpPool
             2     {
             3         RentStreamResult RentTcpStream(int poolTypeKey ,int serviceKey ,out NetworkStream stream ,out int serverID) ;//poolTypeKey表示某個(gè)城市,serviceKey表示某項(xiàng)服務(wù)
             4         void GiveBackTcpStream(int streamHashCode ,int serverID) ;//將tcp連接規(guī)還給連接池
             5         void SetStreamDamaged(int streamHashCode ,int serverID) ;//poolKey如果不易保存,則此處簡(jiǎn)單的傳-1即可    
             6 
             7         event CallBackCountChanged     ActiveConnectionCountChanged ;     
             8         event CallBackPoolStateChanged PoolStateChanged ;        
             9     }
            10 

                RentTcpStream方法中的serviceKey參數(shù)反映了這樣一個(gè)事實(shí):與一個(gè)AS相連的多個(gè)FS中,每個(gè)FS加載的功能插件可以是不一樣的。



                比如,上圖中的
            3個(gè)FS中只有FS1加載了前面介紹的“天氣預(yù)測(cè)服務(wù)”插件,那么當(dāng)一個(gè)“天氣預(yù)測(cè)服務(wù)”請(qǐng)求到達(dá)AS時(shí),AS就只能從與FS1之間的連接池中Rent一個(gè)Tcp連接,而不是從FS2FS3RentTcpStream方法的out參數(shù)serverID表明了這條連接是指向哪個(gè)FS的。

                接下來(lái)考慮這樣一個(gè)問(wèn)題,當(dāng)一個(gè)請(qǐng)求到來(lái),這個(gè)請(qǐng)求可以被FS1FS2FS3處理,那么ITcpPoolsManager到底返回哪個(gè)連接池中的連接了?答案是負(fù)載最小的那個(gè)FS上的連接。
                這是怎么做到的了?其實(shí)很簡(jiǎn)單。每個(gè)FS都定時(shí)(比如一秒一次)地把自己的負(fù)載(CPU利用率和內(nèi)存利用率)通知給AS,通知給AS的方式可以有多種,比如.Net RemotingESFramework中有一個(gè)稱(chēng)為連接池調(diào)度器ITcpPoolScheduler的東東,它記錄了每個(gè)FS實(shí)時(shí)的負(fù)載。這樣當(dāng)一個(gè)請(qǐng)求到來(lái)時(shí),連接池管理器ITcpPoolsManager會(huì)要求連接池調(diào)度器從眾多的FS中選出一個(gè)“滿(mǎn)足條件”且負(fù)載最小的FS。這里的“滿(mǎn)足條件”主要指的是對(duì)應(yīng)的FS上有能處理該請(qǐng)求的功能插件。實(shí)現(xiàn)這種調(diào)度需要的支持的各個(gè)相互協(xié)作的組件的聯(lián)系圖大致如下:


                  
                圖中IServerPerformanceMonitor是用于監(jiān)控本地服務(wù)器性能的組件,它可以定時(shí)發(fā)布本服務(wù)器的性能數(shù)據(jù)(主要是CPU利用率和內(nèi)存利用率),其定義如下:
             1     public interface IServerPerformanceMonitor 
             2     {        
             3         void Start() ;
             4         void Stop() ;        
             5 
             6         int RefreshSpanSecs{get ;set ;}
             7 
             8         event CBackServerPerformance ServerPerformanceDataRefreshed ;
             9     } 
            11 
            12     public delegate void CBackServerPerformance(ServerPerformance performance) ;
             
            13     public class ServerPerformance
            14     {        
            15         public float  CpuUsagePercent ;
            16         public float  MemoryUsagePercent ;
            17     }    
             

            連接池調(diào)度器ITcpPoolScheduler的定義如下:

             1     public interface ITcpPoolScheduler
             2     {
             3         //以下方法屬性?xún)H僅由多連接池管理者調(diào)用
             4         int GetNextTcpPool(int poolTypeKey) ; //返回的是某連接池的服務(wù)端點(diǎn)的serverID ,如果沒(méi)有可用的返回-1
             5         int GetNextTcpPool(int poolTypeKey ,int serviceKey) ; 
             6 
             7         void Initialize() ;
             8         void Dispose() ;//還原到未初始化的狀態(tài)
             9         void SetServerState(int serverID ,bool activated) ;        
            10         void AddServer(int serverID) ;
            11         void RemoveServer(int serverID) ;
            12 
            13 
            14         //以下方法屬性由外部指定或調(diào)用
            15         void SetPerformance(int serverID ,float cpuUsage ,float memUsage) ;        
            16         ITcpPoolHelper    TcpPoolHelper{set ;}
            17     }

                為了使負(fù)載均衡的效果更好,ITcpPoolScheduler可以實(shí)現(xiàn)的非常復(fù)雜,比如進(jìn)行歷史記錄統(tǒng)計(jì)、分析、預(yù)測(cè)等。ESFramework給出了默認(rèn)實(shí)現(xiàn)TcpPoolScheduler

                在組件聯(lián)系圖中還有一個(gè)IPoolEndPointsDisplayer組件,它用于在UI上顯示每個(gè)功能服務(wù)器的詳細(xì)信息和性能數(shù)據(jù)。

            1     public interface IPoolEndPointsDisplayer
            2     {
            3         void RegisterFs(int serverID ,string serverName ,IPEndPoint ipe ,int exceptCount) ;
            4         void UnRegisterFs(int serverID) ;
            5         void SetFsState(int serverID ,bool activated) ;        
            6         void SetActiveCount(int serverID ,int activeCount) ;
            7         void UpdateFsPerformance(int serverID ,float cpuUsage ,float memUsage) ;
            8         void Clear() ;
            9     }

                
               
            FS管理器管理連接上本AS的每個(gè)功能服務(wù)器,這將在后文中講到。
                除了ITcpPool接口,連接池管理器還實(shí)現(xiàn)了ITcpPoolsManager接口:

             1     public interface ITcpPoolsManager :ITcpPool
             2     {
             3         string              TcpPoolSchedulerTypeString{set ;} //"ESFramework.Network.TcpPool.TcpPoolScheduler ,ESFramework"
             4         ArrayList         PoolEndPointList{set ;} //連接池的服務(wù)端PoolEndPointInfo列表        
             5         int                  ReconnectSpan{get ;set ;} // 分鐘         
             6         
             7         void              Initialize() ;    //初次建立連接池
             8         void              Dispose() ; //還原到?jīng)]有初始化的狀態(tài)
             9         void              AddPool(PoolEndPointInfo info) ;
            10         void              RemovePool(int serverID) ;
            11         
            12         void              DisposePoolConnections(int serverID) ;//編號(hào)為serverID的服務(wù)器已停止,所以釋放對(duì)應(yīng)的Pool,但是不刪除池,仍然定時(shí)重連
            13         void              ReconnectPool(int serverID) ; //曾停止的服務(wù)器已啟動(dòng)完畢,所以可以重連了
            14 
            15         /// <summary>
            16         /// 可直接使用 ESFramework.Network.TcpPool.PoolEndPointsDisplayer
            17         /// </summary>
            18         IPoolEndPointsDisplayer PoolEndPointsDisplayer{set ;}        
            19 
            20         //由ITcpPoolScheduler使用
            21         void SetPerformance(int serverID ,float cpuUsage ,float memUsage) ;    
            22         ITcpPoolHelper    TcpPoolHelper{set ;} //可由ESFramework.Architecture.LBS.FourTier.FsManager提供
            23     }    

                AddPool方法和RemovePool方法表明可以動(dòng)態(tài)的添加/移除Tcp連接池。注意接口中的SetPerformance方法,這個(gè)方法將被FS管理器調(diào)用,用于把從Remoting接收到的FS的性能數(shù)據(jù)通知給ITcpPoolsManager,然后ITcpPoolsManager再把這些數(shù)據(jù)提交給ITcpPoolScheduler記錄,當(dāng)需要進(jìn)行調(diào)度的時(shí)候,ITcpPoolScheduler從這些記錄中進(jìn)行分析計(jì)算并找到負(fù)載最小的FSTcpPoolSchedulerTypeString屬性用于向連接池管理器提供調(diào)度者的實(shí)際類(lèi)型,管理器將會(huì)通過(guò)反射創(chuàng)建調(diào)度者的實(shí)例。

            還有一個(gè)需要設(shè)置的屬性ITcpPoolHelper

            1     public interface ITcpPoolHelper
            2     {
            3         bool ContainsService(int serverID ,int serviceKey) ;
            4         bool ServerIsTheType(int serverID ,int destType) ;
            5         bool ServerIsCompatible(int serverID ,int destType ,int serviceKey) ;
            6         string GetServerNameByID(int serverID) ;
            7     }

                由于這個(gè)接口提供了每個(gè)功能服務(wù)器詳細(xì)信息,所以這個(gè)接口的實(shí)現(xiàn)可以直接由前面提到的FS管理器順帶實(shí)現(xiàn)。

                ITcpPoolsManager
            是一個(gè)比較復(fù)雜的組件,它需要涉及到多個(gè)組件的協(xié)作。所以如果看完這篇文章,仍然還有些不清楚的地方,是很正常的。在后面系列文章的繼續(xù)講述中,這些不清晰的地方會(huì)慢慢撥開(kāi)迷霧。

            感謝關(guān)注。

            posted on 2007-04-14 22:35 譚文政 閱讀(478) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): ESFramework
            久久嫩草影院免费看夜色| 国内精品伊人久久久久av一坑| 国产精品久久国产精品99盘| 久久婷婷五月综合97色| 久久91精品久久91综合| 久久人妻少妇嫩草AV无码蜜桃| 久久婷婷午色综合夜啪| 久久精品国产亚洲AV麻豆网站 | 亚洲精品无码久久久影院相关影片| 亚洲AV无码一区东京热久久| 99久久久久| 蜜臀av性久久久久蜜臀aⅴ| 国产福利电影一区二区三区久久老子无码午夜伦不 | 亚洲精品tv久久久久| 久久人人妻人人爽人人爽| 久久久噜噜噜久久| 国产精品99精品久久免费| 日韩精品无码久久一区二区三| 久久国产精品成人片免费| 欧美性猛交xxxx免费看久久久| 久久久久99精品成人片欧美| 亚洲欧美国产日韩综合久久| 超级碰久久免费公开视频| 无码专区久久综合久中文字幕 | 欧洲人妻丰满av无码久久不卡| 国产伊人久久| 狠狠久久亚洲欧美专区| 99久久精品免费看国产一区二区三区 | 91久久九九无码成人网站| 欧美精品久久久久久久自慰| 精品国产乱码久久久久久人妻| 久久无码一区二区三区少妇| 国产福利电影一区二区三区久久老子无码午夜伦不| 一本色道久久HEZYO无码| 久久无码精品一区二区三区| 日日狠狠久久偷偷色综合0| 精品久久久久久无码人妻热 | 欧美喷潮久久久XXXXx| 久久精品国产第一区二区三区| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久久久久精品无码人妻|