ESFramework介绍之(11)-- Tcp连接池管理器

    上文已经讲到,Tcp连接池管理器为我们的应用进行了很多复杂的管理,比如功能服务器的调度(实现FS的负载均衡)、连接池的动态添加/移除、控制每个连接池的相关参数在UI上的显示等,并且连接池管理器与单个连接池拥有一样的接口ITcpPool。我们先回顾一下这个接口: 

 1     public interface ITcpPool
 2     {
 3         RentStreamResult RentTcpStream(int poolTypeKey ,int serviceKey ,out NetworkStream stream ,out int serverID) ;//poolTypeKey表示某个城市,serviceKey表示某项服务
 4         void GiveBackTcpStream(int streamHashCode ,int serverID) ;//将tcp连接规还给连接池
 5         void SetStreamDamaged(int streamHashCode ,int serverID) ;//poolKey如果不易保存,则此处简单的传-1即可    
 6 
 7         event CallBackCountChanged     ActiveConnectionCountChanged ;     
 8         event CallBackPoolStateChanged PoolStateChanged ;        
 9     }
10 

    RentTcpStream方法中的serviceKey参数反映了这样一个事实:与一个AS相连的多个FS中,每个FS加载的功能插件可以是不一样的。

    比如,上图中的3个FS中只有FS1加载了前面介绍的“天气预测服务”插件,那么当一个“天气预测服务”请求到达AS时,AS就只能从与FS1之间的连接池中Rent一个Tcp连接,而不是从FS2或FS3。RentTcpStream方法的out参数serverID表明了这条连接是指向哪个FS的。

    接下来考虑这样一个问题,当一个请求到来,这个请求可以被FS1、FS2、FS3处理,那么ITcpPoolsManager到底返回哪个连接池中的连接了?答案是负载最小的那个FS上的连接。
    这是怎么做到的了?其实很简单。每个FS都定时(比如一秒一次)地把自己的负载(CPU利用率和内存利用率)通知给AS,通知给AS的方式可以有多种,比如.Net Remoting。ESFramework中有一个称为连接池调度器ITcpPoolScheduler的东东,它记录了每个FS实时的负载。这样当一个请求到来时,连接池管理器ITcpPoolsManager会要求连接池调度器从众多的FS中选出一个“满足条件”且负载最小的FS。这里的“满足条件”主要指的是对应的FS上有能处理该请求的功能插件。实现这种调度需要的支持的各个相互协作的组件的联系图大致如下:


      
    图中IServerPerformanceMonitor是用于监控本地服务器性能的组件,它可以定时发布本服务器的性能数据(主要是CPU利用率和内存利用率),其定义如下:

 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     }    

 

连接池调度器ITcpPoolScheduler的定义如下:

 1     public interface ITcpPoolScheduler
 2     {
 3         //以下方法属性仅仅由多连接池管理者调用
 4         int GetNextTcpPool(int poolTypeKey) ; //返回的是某连接池的服务端点的serverID ,如果没有可用的返回-1
 5         int GetNextTcpPool(int poolTypeKey ,int serviceKey) ; 
 6 
 7         void Initialize() ;
 8         void Dispose() ;//还原到未初始化的状态
 9         void SetServerState(int serverID ,bool activated) ;        
10         void AddServer(int serverID) ;
11         void RemoveServer(int serverID) ;
12 
13 
14         //以下方法属性由外部指定或调用
15         void SetPerformance(int serverID ,float cpuUsage ,float memUsage) ;        
16         ITcpPoolHelper    TcpPoolHelper{set ;}
17     }

    为了使负载均衡的效果更好,ITcpPoolScheduler可以实现的非常复杂,比如进行历史记录统计、分析、预测等。ESFramework给出了默认实现TcpPoolScheduler。

    在组件联系图中还有一个IPoolEndPointsDisplayer组件,它用于在UI上显示每个功能服务器的详细信息和性能数据。

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的每个功能服务器,这将在后文中讲到。
    除了ITcpPool接口,连接池管理器还实现了ITcpPoolsManager接口:

 1     public interface ITcpPoolsManager :ITcpPool
 2     {
 3         string              TcpPoolSchedulerTypeString{set ;} //"ESFramework.Network.TcpPool.TcpPoolScheduler ,ESFramework"
 4         ArrayList         PoolEndPointList{set ;} //连接池的服务端PoolEndPointInfo列表        
 5         int                  ReconnectSpan{get ;set ;} // 分钟         
 6         
 7         void              Initialize() ;    //初次建立连接池
 8         void              Dispose() ; //还原到没有初始化的状态
 9         void              AddPool(PoolEndPointInfo info) ;
10         void              RemovePool(int serverID) ;
11         
12         void              DisposePoolConnections(int serverID) ;//编号为serverID的服务器已停止,所以释放对应的Pool,但是不删除池,仍然定时重连
13         void              ReconnectPool(int serverID) ; //曾停止的服务器已启动完毕,所以可以重连了
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方法表明可以动态的添加/移除Tcp连接池。注意接口中的SetPerformance方法,这个方法将被FS管理器调用,用于把从Remoting接收到的FS的性能数据通知给ITcpPoolsManager,然后ITcpPoolsManager再把这些数据提交给ITcpPoolScheduler记录,当需要进行调度的时候,ITcpPoolScheduler从这些记录中进行分析计算并找到负载最小的FS。TcpPoolSchedulerTypeString属性用于向连接池管理器提供调度者的实际类型,管理器将会通过反射创建调度者的实例。

还有一个需要设置的属性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     }

    由于这个接口提供了每个功能服务器详细信息,所以这个接口的实现可以直接由前面提到的FS管理器顺带实现。

    ITcpPoolsManager是一个比较复杂的组件,它需要涉及到多个组件的协作。所以如果看完这篇文章,仍然还有些不清楚的地方,是很正常的。在后面系列文章的继续讲述中,这些不清晰的地方会慢慢拨开迷雾。

感谢关注!

上篇文章:ESFramework介绍之(10)-- Tcp连接池

转到  :ESFramework 可复用的通信框架(序) 

时间: 2024-09-30 05:34:37

ESFramework介绍之(11)-- Tcp连接池管理器的相关文章

ESFramework介绍之(10)-- Tcp连接池

    凡是带有"池"的,比如数据库连接池.对象池.缓冲区池(后面可以看到IBuffPool)等等,都是为了避免资源的反复创建/销毁所带来的开销.需要为哪些资源对象建立"池"了?这些资源对象通常符合下面几个特性:(1)在应用中需要反复的被创建/销毁.(2)创建/销毁的开销比较大(3)应用中给定时刻,对该资源对象的数量要求比较大(4)资源对象最好是无状态的(Stateless),这样方便直接复用     AS(回顾)将所有的功能服务请求转发给为该AS提供服务的FS群中

C/C++语言编写的客户应用为例开发连接池管理的方法

CICS 交易网关(CICS Transaction Gateway,以下简称 CICS TG)是 IBM 针对 CICS 交易服务器(CICS Transaction Server,以下简称 CICS TS)开发的高性能.高安全.高可用性和高扩容能力的接入方式.CICS TG 接受客户应用的请求,然后使用 TCPIP,EXCI 和 IPIC 等连接协议,以http://www.aliyun.com/zixun/aggregation/13996.html">负载均衡和动态选择 CICS

网络编程-哪位大神能告诉我TCP连接池是干吗用的

问题描述 哪位大神能告诉我TCP连接池是干吗用的 如题,通俗易懂的说法有吗?我们老师说是一个包,那我应该怎么管理它 解决方案 http://zhuweisky.cnblogs.com/archive/2006/03/16/351301.html 解决方案二: 凡是带有"池"的,比如数据库连接池.对象池.缓冲区池(后面可以看到IBuffPool)等等,都是为了避免资源的反复创建/销毁所带来的开销.需要为哪些资源对象建立"池"了?这些资源对象通常符合下面几个特性: (1

ESFramework介绍之(4)――消息拦截器INetMessageHook

    网络上传输的消息经常是经过加密和压缩,有的特定类型的消息可能还需要进行其它变形,ESFramework通过INetMessageHook对这些功能提供支持.需要说明的是,ESFramework对消息进行截获(Hook)处理有两种方式,一是仅仅Hook处理消息主体(Body),而不对消息头作任何变换:另一种方式是对整个消息(包括消息头和主体)都进行Hook处理.通常,第一种方式已经能够满足我们的大多数应用,并且效率也更高,如果应用有更特殊的要求,可以采用第二种方式.本文先介绍第一种方式,后

AS与FS通信实现 —— ESFramework介绍之(33)

    (本文部分内容只适合ESFramework V0.3+)     在ESFramework介绍之(14)-- AS与FS通信方案 一文中,我们讲到了AS与FS之间基本的通信方案,并且采取了一些策略来保证AS与FS之间的稳定通信.本文我们将给出AS与FS通信的两种实现,即基于Tcp连接池的通信实现和基于Remoting的通信实现.     我们已经知道,AS与FS之间的通信分为两类,一类是非功能通信,一类是功能通信.非功能通信指的是FS向AS注册.注销等通信,这种通信仅仅是FS主动联系AS

HttpClient连接池原理及一次连接时序图

1.       httpClient介绍 HttpClient是一个实现了http协议的开源Java客户端工具库,可以通过程序发送http请求.   1.1.  HttpClient发送请求和接收响应 1.1.1.      代码示例 以Get请求为例,以下代码获得google主页内容并将返回结果打印出来. public final static void main(String[] args) throws Exception {           HttpClient httpclien

连接池与SQL Server 2000 Analysis Services

适用于:Microsoft SQL Server? 2000 Analysis Services 摘要:学习如何使用 Microsoft XML for Analysis Provider 附带的连接池对象来开发适用于 Microsoft SQL Server 2000 Analysis Services 的可伸缩客户端和 Web 应用程序. 简介 资源管理是开发可伸缩客户端和基于 Web 的应用程序时需要考虑的一个重要问题.在构造可为许多并发用户提供服务的客户端应用程序时,资源管理的指导原则是

.Net开发中TCP反向代理、Socket 连接池和数据包解析器教程

TCP反向代理 一般的Web反向代理大家很熟悉了,主要是通过在客户端和服务端之间架设一层代理服务器,转发客户端的请求至服务端或数据库,并将结果回复给客户端. 其特点主要有: 1.缓存一些数据库I/O过重.却更新不频繁的数据,或者静态数据,如文件.图片等.2.隔离客户端(公网)和服务端(windows服务.Web服务.文件服务),仅将反向代理服务器的IP.名称.host和端口等暴露给公网.3.基于第2点,其应该是轻量的.可随时重启的,这在服务端自身所在的服务器重启代价较高或不能忍受重启的条件下,极

基于C/S的4层架构 —— ESFramework介绍之(6)

    ESFramework的4层结构的4层分别是:客户端(Client).应用服务器(AS).功能服务器(FS).数据库服务器.它们之间的联系图示意如下:     FS (FunctionServer),功能服务器,处理并且仅处理所有的功能性请求,不参与用户管理.状态保持等,提供最纯粹的功能服务.    AS (ApplicationServer),应用服务器,转发所有的功能请求给FS,并处理所有的非功能请求,并管理终端用户.进行状态保持.日志记录等.    上图中的功能服务器FS的个数可能