ESFramework介绍之(15)-- IRAS

    每个城市都对应着自己的AS,每个AS都有一组FS为之服务,而所有的AS都由一个IRAS联系/管理起来(回顾)。前面我们已经提到,所有的FS都可以是动态添加/移除的,并且FS的地址也是自由可变的。同样,所有AS也都是可以动态添加/移除的,并且AS的地址也是可变的(这里AS与IRAS的机制同上文介绍的FS与AS之间的机制一样)。但是,唯一不能随便变化的是IRAS的地址。这是因为,所有终端连的第一个服务器就是IRAS,然后从IRAS获取目的AS的地址,这样才去连接目的AS请求服务。所以,如果IRAS的地址一改变,意味着所有终端的配置文件中的IRAS地址信息都得修改,这个工作是很麻烦的。所以,最好请保证IRAS的地址不变。

    IRAS的主要职责有三点:
(1) 管理所有在线的AS
    每个AS启动时,都通过IRAS发布的远程接口把自己的地址等信息注册到IRAS,当AS退出时,也同样通知IRAS。并且,AS也需要定时发“Check消息”给IRAS表明自己在线。这样,IRAS上就记录了所有在线AS的地址。
    我们看一下这种情况:当某个终端连上武汉AS,但是它却发送了一个请求上海的数据的请求,武汉AS无法处理这个请求,于是,武汉AS向IRAS询问上海AS的地址,当获取上海AS地址后,武汉AS会将该请求转发给上海AS处理。AS与IRAS之间,AS与AS之间的通信全部通过远程调用的方式进行。下面给出IRAS发布的远程服务接口:

 1     public interface IIrasRemotingService_4As
 2     {
 3         //AS注册、注销
 4         void RegisterAppServer(ServerInformation asInfo) ;
 5         void ReviseServiceList(int serverID ,ArrayList serviceList) ;
 6         void UnRegisterAppServer(int serverID);
 7         void CheckMySelf(ServerInformation asInfo); //传递冗余信息,用以保证稳定通信        
 8     
 9         string GetAppServerIp(int cityCode) ;        
10         ServerInformation GetAppServerDataByCityCode(int cityCode) ;
11     }

 
(2) 为终端提供跨区域的功能服务
    比如,有些请求不是某个特定的AS能处理的,而是需要将某几个AS协调起来共同才能完成,这样的请求通常是跨区域请求,比如跨区域的路径规划服务,可能会跨越广州市、深圳市等。这个时候,IRAS充当的角色就是这样的协调者,首先IRAS将跨区域的请求分解成几个单区域的请求分别交给对应的AS处理,然后把所有的处理结果组合起来。当然,这之外可能还有更多的工作要做。

(3) 为终端提供非区域基本请求
    比如终端连上IRAS后,请求某个AS的地址信息等。

    注意,IRAS为终端提供服务仍然是通过Udp/Tcp进行的,仍然可以复用AS/FS使用的网络组件。
    从前面的介绍我们已经想到,IRAS的运行必须非常稳定,它是ESF平台上的核心节点。

    最后说一下当网络出现故障后恢复或服务器(AS或IRAS)重启后,IRAS中保存的AS的动态信息如何重建?分为三种情况:
(1)某个AS重启:该AS向IRAS发送“我启动了”的消息,该消息中必须包含该AS的详细信息。
(2)IRAS重启:通过AS传递给IRAS的定时Check消息,Check消息中必须包含AS的详细信息。
(3)网络断开后恢复:同(2)。

    通过前面一系列的文章的介绍,我们已经将ESF平台上的三种服务器FS、AS、IRAS的主要功能、职责等概念了解的一些了。后面的文章我们会继续深入这些细节定义,并使之“标准化”,以融入到ESFramework框架内,使其高度可复用。感谢继续关注!

上一篇文章:ESFramework介绍之(14)-- AS与FS通信方案
转到  :ESFramework 可复用的通信框架(序) 

 

 

 

 

时间: 2024-09-06 23:12:44

ESFramework介绍之(15)-- IRAS的相关文章

ESFramework介绍之(17)―― 支持漫游用户和跨区域功能请求

    对于漫游用户的支持和跨区域功能请求的支持是ESFramework最基本的目的之一(回顾),在详细讲述解决方案之前,先了解一下关于这个问题的上下文.    在我们前面讲述的4层C/S架构中,每个AS负责一块区域.比如上海AS负责处理所有目标城市为上海的功能请求和管理所有在上海AS上注册的用户(比如PDA用户或手机用户).如果一个本是在上海注册的用户出差来到了武汉,最方便的,他会连上武汉的AS,这样对于武汉AS来说,这个用户就是漫游用户了.    如果上海的用户登陆上了上海的AS,但是他需要

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

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

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

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

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

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

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

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

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

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

ESFramework介绍之(7)-- 服务器代理IServerAgent

    (本文原作于2006.03.15,第一次修正于2006.06.06,修正后适用于ESFramework V0.3+)     (本文是ESFramework对客户端开发的支持特性之一 ,如果要按顺序阅读,请转到ESFramework介绍(序))         分布式系统的构建一般有两种模式,一是基于消息(如Tcp,http等),一是基于方法调用(如RPC.WebService.Remoting).深入想一想,它们其实是一回事.如果你了解过.NET的Proxy,那么你会发现,方法调用和消

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