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,以表明FS自己的状态。功能通信是指AS将功能请求转发给FS处理,这可以通过Tcp连接池或Remoting的方式进行。在ESFramework介绍之(14)-- AS与FS通信方案 一文中,我们主要描述了非功能通信的策略,这里我们将描述功能通信的两种实现。

    要能比较全面的说清楚AS与FS之间的功能通信,我不得不从一个更大的视野来讨论问题,其中会涉及到对众多FS的管理、调度、状态显示等问题。让我们先从基于Tcp连接池的通信开始。先给出个与该实现相关的组件关系图先:

    我来解释一下各个组件的作用、职责,以及它们之间的关系。
(1)IAsRemotingService_4Fs,AS通过该接口发布远程服务给FS,FS可以通过该接口来向AS表明自己的状态,如注册、启动、停止、注销、发布FS自己的性能数据等。
(2)IFsManager ,该组件实现了IAsRemotingService_4Fs接口,它对所有在线的FS进行管理和状态监控。IFsManager 实现了IServerScheduler接口,它能够在多个FS之间进行调度,从而实现负载均衡。因为IFsManager 知道每个FS的实时性能数据,所以它可以做到这一点。
(3)IFsDisplayer ,用于在UI上显示每个FS的相关数据,比如FS的编号、FS的名称、FS的服务列表、性能数据(Cpu利用率、Memory的利用率)等。
(4)ITcpPoolsManager,这是基于Tcp连接池实现AS与FS之间通信的核心组件,它用于管理一个应用服务器和多个功能服务器之间的所有TCP连接池。它借助IServerScheduler从众多的FS中选取一个最适合并且负载最小的FS来处理功能请求。
(5)TPBasedDataDealer,基于Tcp连接池的处理器,它是一种伪处理器(FakeDataDealer),即它自己并不真正的处理消息,而是将消息转交给ITcpPoolsManager处理。相关更多内容可参考这里:ESFramework介绍之(12)―― 基于Tcp连接池的消息处理器
(6)ITcpPool接口,在ESFramework介绍之(11)-- Tcp连接池管理器中我们已经知道,ITcpPool接口可以使我们将一组Tcp连接池当作一个连接池来看待。
(8)Bridge,这是FsManager_TcpPoolsManager_Bridge桥接组件,它用于连接IFsManager和ITcpPoolsManager,主要目的是将IFsManager的FsAdded事件和FsRemoved事件链接到ITcpPoolsManager对应的方法上,这样ITcpPoolsManager就可以动态的添加/移除对应的Tcp连接池了。

    理解了上面的组件关系图,然后来组装ESFramework中对应的组件以形成基于Tcp连接池的AS与FS通信就非常的简单了。下面我们来看看基于Remoting的AS与FS通信的实现,这个实现在ESFramework V0.3+中才会提供。
    还是先给出组件关系图:

    可以看到,大部分组件和基于Tcp连接池的实现是一样的,这样可以最大化组件的复用(要达到这样的效果,需要不断地重构组件),下面介绍一下不一样的那些组件的作用。
(1)IRemoteHandleManager,用于管理所有的(FS)远程句柄,因为要与多个FS进行远程通信,所以需要将这些远程句柄管理起来,并且IRemoteHandleManager同样借助了IServerScheduler从众多的FS中选取一个最适合并且负载最小的FS来以Remoting的方式处理功能请求。
(2)Bridge,这个桥接组件是FsManager_RemoteHandleManager_Bridge,它的作用与FsManager_TcpPoolsManager_Bridge桥接组件相同。它将IFsManager的FsAdded事件和FsRemoved事件链接到IRemoteHandleManager对应的方法上,这样IRemoteHandleManager就可以动态的添加/移除对应的FS远程句柄了。
(3)RemotingBasedDataDealer ,基于Remoting的处理器,通过IRemoteHandleManager将所有的请求转交给远程句柄处理。
(4)INakeDispatcher,这是ESFramework最内部的消息分派器组件,当消息到达INakeDispatcher内部,就不再与Spy或Hook相关。
(5)IFsRemotingService_4As,这是FS发布的远程服务组件,该组件将所有来自AS的请求都交给INakeDispatcher分派处理。

    我们看到,基于Tcp连接池的实现和基于Remoting的实现的原理基本是一致的,那么何时该使用Tcp连接池的实现,何时又使用基于Remoting的实现了?答案取决于多个方面,比如
(1)如果AS与FS都基于ESFramework创建,并且位于同一局域网内,使用Tcp连接池效率可能更高。因为Remoting底层会对NetMessage进行列集/散集,这会折损效率(即使其底层仍然使用Tcp)。
(2)如果AS与FS分布于广域网中,并且需要穿越多个防火墙,那么直接使用Tcp连接池可能不可行,因为有的防火墙可能关闭了我们服务的Tcp端口。这时可以考虑使用Remoting的方式,因为Remoting可以基于Http进行。
(3)又如果我们的FS为了获取更高的效率,全部采用C++构建,那么无法提供Remoting,这时就只有采用Tcp连接池了。
    也许,还有很多其它的情景和对应的选择,你可以自己去思考。

    如果两种方式都可行,那么我们可以随意的选择一种,在这两种实现之间进行切换仅仅是个配置的问题(比如借助Spring.net)。

上篇文章:ESFramework介绍之(32)―― Tcp客户端核心组件关系图

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

时间: 2024-10-12 06:27:01

AS与FS通信实现 —— ESFramework介绍之(33)的相关文章

ESFramework介绍之(14)-- AS与FS通信方案

    前面我们已经多次提到,每个AS都有一组FS为之服务(回顾),AS将接收到的功能请求通过Tcp连接池 或Remoting转发给某个FS处理.下面我们将深入讨论AS和FS之间的通信机制.     首先要解决第一个问题,AS如何知道每个为之服务的FS的地址?    最常见的一种解决方案是,AS处的配置文件中有一个FS地址列表,AS每次启动时,就读取这个列表,然后与列表中的每个FS建立Tcp连接池.这种方案很容易实现,但是有很多缺点.最主要的是当动态的添加/移除FS时,都需要修改AS配置文件中的

ESFramework介绍之(22)―― 服务器系统自动升级

    (本文名字取为"服务器系统自动升级",实际上适用于所有应用程序自动升级的情况.)    前文介绍了在服务器或客户端应用程序运行的过程中,插件如何自动升级.更新.基于前文相同的理由,AS.FS.IRAS也需要有自动升级的功能.     与插件在运行时动态更新不同,服务器系统无法在运行时动态更新,只有在服务器系统重新启动的时候,才是自动升级的切入点.(1)对于功能服务器FS,可以采用持续/逐个更新的方式,即依次重启每个功能服务器.这样可以避免功能服务被中断的情况发生.需要注意的是,

ESFramework介绍之(8)-- 客户端插件IPassiveAddin

    前文已经提到了,在IServerAgent的基础上,客户端也可以采用插件的结构形式,客户端插件需要实现IPassiveAddin接口.    我的想法是,当客户端主程序加载一个新的PassiveAddin时,可以在某个菜单的子Items上添加一项,当双击这个子菜单项时,则弹出该客户端插件提供的"业务操作窗体".这只是使用客户端插件的可行方式之一,你完全可以根据你的应用来决定使用形式.IPassiveAddin接口定义如下:  1     /// <summary> 

ESFramework介绍之(29)―― 插件公共设施 AddinUtil

    (本文适用于 ESFramework V0.2+)    不知你是否还记得,前面我们讲过,ESFramework规定了插件有如下特点: (1)一个插件是一个独立的物理单元.它可以独立的提供一项完整的服务(功能),而不需要依赖于其它插件. (2)插件能自我描述 ―― 插件的所有对外的发布信息都由插件自己内部提供,而不依赖于外部文件或注册表. (3)插件能自我管理 ―― 插件如果需要配置信息,则插件自己能读取和修改配置信息,而不是框架来完成这些事情.(4)插件自我独立   ―― 一个插件不得

ESFramework介绍之(18)―― Tcp用户管理器组件

    当我们的应用中客户端与AS之间是通过Tcp进行通信的时候,通常,应用也要求管理所有在线的用户.这种管理至少包含以下几点:(1) 当用户上线时,记录上线时间(2) 当用户请求服务时,记录请求服务的时间.服务的类型.本次服务下载的数据量(3) 当用户下线时,记录下线时间.并把本次用户登录.请求服务过程中的所有信息持久化保存(如记录到数据库)     在ESFramework中,实现这种管理的是ITcpUserManager组件,通常,该组件由AS使用(因为在AS.FS.IRAS中只有AS是必

ESFramework介绍之(20)―― 插件自动升级

    当我们的服务平台搭建成功后,所需要做的主要事情就是开发服务端功能插件(IFunAddin)和客户端插件(IPassiveAddin),每个插件对(AddinPair)实现了一组相似或相近的需求/功能.     好了,我们已经开发了十多对插件对,然后分别XCopy到了各个服务器节点上,"整个系统"已经投入了运行.通过前面的介绍(回顾),相信大家对我们的"整个系统"有了个大致的映像.我们的IRAS服务器通常只存在于一个节点上,而我们的AS和对应的多个FS通常分布

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

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

ESFramework介绍之(13)-- 功能插件处理器工厂

    上文讲述的是AS中的基于连接池的消息处理器,现在我们把焦点转移到功能服务器FS上来,看看FS上消息分派的过程.当FS接收到到一个请求后,会从已加载的功能插件列表中选择一个合适的插件来处理这个消息,而每一个功能插件就相当于一个消息处理器.FS和AS的结构一致:    要注意的是,功能服务器FS上收到的所有消息都应该交给功能插件来处理,不存在其它的处理方式.这是使得FS"纯粹"的必须要求.上图已经很清楚的表示了功能插件处理器工厂的位置和作用.它借助插件管理器实现"工厂&q

ESFramework介绍之(9)-- 插件对(Addin Pair)调试“框架”

    使用ESFramework开发C/S(通常为4层.3层也没问题)应用,当需要增加一项新的业务时,我们需要做的仅仅是开发两个插件,一个是服务端的业务功能插件(FunAddin),一个是客户端插件(PassiveAddin),这两个插件合在一起称为Addin Pair.开发这两个插件,只需要关注于业务,而其它与业务无关的比如网络通信.加密.数据安全,都不用管.ESFramework很好的将这些关注点分离开来,使得写"业务"插件的程序员的工作变得非常单纯,在ESFramework介绍