亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

ESFramework介紹之(10)-- Tcp連接池

系統 1959 0

凡是帶有“池”的,比如數據庫連接池、對象池、緩沖區池(后面可以看到 IBuffPool )等等,都是為了避免資源的反復創建 / 銷毀所帶來的開銷。需要為哪些資源對象建立“池”了?這些資源對象通常符合下面幾個特性:
(1) 在應用中需要反復的被創建 / 銷毀。
(2) 創建 / 銷毀的開銷比較大
(3) 應用中給定時刻,對該資源對象的數量要求比較大
(4) 資源對象最好是無狀態的( Stateless ),這樣方便直接復用

AS( 回顧
將所有的功能服務請求轉發給為該 AS 提供服務的 FS 群中的一個(參見。。。),然后 FS 將請求交給對應的功能插件處理。那么 AS FS 之間的通信通過什么方式進行了?可選的方式有 .netRemoting WebService Tcp/Udp 等。基于效率和準確性的考慮, WebService Udp 是不大合適的。那么 TCP .netRemoting ,到底選用哪個?我們知道 .netRemoting 底層也是基于 Tcp Http 協議的,為了做到模擬本地方法調用的方式, .NETRemoting 也做了很多轉換的操作(堆棧幀《=》消息),導致了一些開銷,而直接使用 Tcp 則可以避免,而且 AS FS 之間的消息的格式是兼容的(主要是使用了完全相同的消息頭,這就夠了),也就是說一條消息從客戶端發出,可以不需做任何轉換就直接被 FS 的功能插件處理(加密、壓縮不計在內)。

如你所想, ESFramework 推薦的方式是 AS FS 直接通過低層的 Tcp 進行通信。為了避免 Tcp 連接不斷建立、銷毀所帶來的開銷, AS FS 通信前,可以建立 Tcp 連接池。本文就關注 Tcp 連接池的原理和實現。

Tcp
連接池中存放的是 Tcp 連接――即 NetworkStream 對象,當應用需要使用時,就從 Tcp 連接池中租借“ Rent ”一條連接,用完后再歸還“ GiveBack ”給連接池。

public class TcpStreamPool:ITcpStreamPool,ITcpPool

從上面的定義 可以看到 TcpStreamPool 從兩個接口繼承: ITcpPool ITcpStreamPool 。先看看 ITcpStreamPool 的定義:
1 /// <summary>
2 /// ITCPStreamPooltcp連接池用于管理大量的TCP連接
3 /// 作者:朱偉sky.zhuwei@163.com
4 /// sky2005.02.24
5 /// </summary>
6 public interface ITcpStreamPool
7 {
8 int ServerID{ get ; set ;}
9 int StreamCount{ get ; set ;} // 期望連接總數
10 int ActiveConnectionCount{ get ;} // 實際可用的連接數
11 IPEndPointFsIpe{ get ; set ;} // 功能服務器的IPE
12 int ReconnectSpan{ get ; set ;} // 分鐘
13 bool IsActive{ get ;}
14
15 void ReConnect(); // 手動重連
16 void Initialize();
17 void DisposeConnections(); // 釋放池中所有連接,可以通過ReConnect來重新建立連接
18 void SetStreamDamaged( int streamHashCode);
19
20 NetworkStreamRentTcpStream();
21 void GiveBackTcpStream( int streamHashCode); // 將tcp連接規還給連接池
22 }

AS 和每個 FS 之間都有一個連接池,每個功能服務器的區分是通過 ServerID 來的,所以連接池也有一個 ServerID 屬性標志了本連接池是與哪個 FS 相連的。 ReconnectSpan 屬性表明連接池要支持重連機制,即當連接池中的所有連接都斷開后(可能是 FS 掉線引起的),連接池應能定時重連 FS ,直至該池中的所有連接重新建立。
如果應用從連接池 Rent 了一條連接,然后在使用的過程中該連接斷開了,則應用應該調用連接池的 SetStreamDamaged 方法通知連接池該連接已不可用。 RentTcpStream 方法和 GiveBackTcpStream 方法是我們最常用的租借 / 歸還連接的方法了。
注意,很多方法的參數中有 streamHashCode 參數,它是 NetworkStream 對象的 Hashcode ,系統中的每個 NetworkStream 對象的 HashCode 是不同的,并且,它的 HashCode NetworkStream 對象的整個生命期間不變,所以可以使用 HashCode 唯一標志每個連接。

似乎, ITcpStreamPool 接口已經反映了一個連接池的所有東西,是的。那么 ITcpPool 接口又起什么作用了?現看看 ITcpPool 的樣子:

1 /// <summary>
2 /// ITcpPool用于將一個TCP連接池和一組TCP連接池統一起來。這樣消息分派器只需使用ITcpPool接口即可。
3 /// zhuweisky
4 /// </summary>
5 public interface ITcpPool
6 {
7 RentStreamResultRentTcpStream( int poolTypeKey, int serviceKey, out NetworkStreamstream, out int serverID); // poolTypeKey表示某個城市,serviceKey表示某項服務
8 void GiveBackTcpStream( int streamHashCode, int serverID); // 將tcp連接規還給連接池
9 void SetStreamDamaged( int streamHashCode, int serverID); // poolKey如果不易保存,則此處簡單的傳-1即可
10
11 event CallBackCountChangedActiveConnectionCountChanged;
12 event CallBackPoolStateChangedPoolStateChanged;
13 }
14
15 public delegate void CallBackCountChanged( int serverID, int activeConnCount);
16 public delegate void CallBackPoolStateChanged( int serverID, bool disconnected);
17
18 public enum RentStreamResult
19 {
20 Succeed,Busy,TheServiceNotExist
21 }

你可能已經發現, ITcpPool 中的所有元素在 ITcpStreamPool 接口中都可以找到對應物,只是有些方法的參數變復雜了。這主要是因為 ITcpStreamPool 接口針對的是一個FS,而 ITcpPool可能是針對一個FS也可能是一組FS。當 ITcpPool背后是一組FS時,就 需要參數ServerID來區分每一個FS。 我們知道, AS 和對應的每個 FS 之間都使用一個 Tcp 連接池通信:
ESFramework介紹之(10)-- Tcp連接池

所有的這些連接池需要被管理起來, ESFramework 中的 ITcpPoolsManager 連接池管理器)組件實現了對多個 Tcp 連接池的管理。為了把連接池管理器和單個連接池統一起來,使它們有相同的外部接口,所以引入了 ITcpPool 接口。
這樣做的好處是,在應用中直接使用
ITcpPool 接口就可以了,而不用關心這個接口背后是一個“單個連接池”(對應單個 FS )還是由連接池管理器管理的“一組連接池”(對應多個 FS )。而且 ITcpPoolsManager 為我們的應用進行了很多復雜的管理,比如動能服務器的調度(實現 FS 的負載均衡)、連接池的動態添加 / 移除等。這些將在下文中介紹。

下一篇文章:ESFramework介紹之(11)-- Tcp連接池管理器

上一篇文章: ESFramework介紹之(6)―― 基于C/S的4層架構概述

轉到: ESFramework 可復用的通信框架(序)

ESFramework介紹之(10)-- Tcp連接池


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 9999人体做爰大胆 | 国产亚洲精品美女2020久久 | 成人久久伊人精品伊人 | 色插综合 | 亚洲精品入口一区二区在线观看 | 黄色男人的天堂 | 福利岛国深夜在线 | 久久综合中文字幕一区二区三区 | 国产一区二区高清 | 7799国产精品久久久久99 | 成人a毛片视频免费看 | 俄罗斯一级毛片aaaa | 精品久久中文字幕有码 | 国产一级精品高清一级毛片 | 天天插日日射 | 简单视频在线播放jdav | 欧洲一级黄色 | 亚洲涩色 | 亚洲成年网 | 久久精品阿娇 | 91国在线高清视频 | 免费福利小视频 | 日本精品一区二区三本中文 | 激情一区二区三区成人 | 久久se精品一区二区国产 | 亚洲精品国产第一区二区多人 | 99热伊人| 六月丁香婷婷激情国产 | 亚洲精品久久久成人 | 裸身裸乳免费视频网站 | 久久久小视频 | 欧美综合图区亚洲综合图区 | 亚洲人成网站色7799在线观看 | www.久草视频| 免费一级毛片在级播放 | 久久综合久久伊人 | 精品久久久久久中文字幕专区 | 正在播放一区 | 在线日韩一区 | 全午夜免费一级毛片 | 国精品一区二区三区 |