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

  • 时间:
  • 浏览:0

1     public interface IRamblesManager

2     {

3         int     GetResideCityCode(string userID) ; //用户注册(手机号码)所属地

4         int     GetUserCurrCityCode(string userID) ; //用户当前所在地

5         void    RemoveRambles(string userID) ;

6         void    RegisterRambles(string userID ,int cityCode) ;

7     }

    /// <summary>

    
/// ToClientSender 将数据(一一个多多删改的请求--header+body)转发给目标用户。隐藏了目标用户的位置

    
/// 目标用户可能连接在其它服务器节点上    

    
/// </summary>

    public interface IToClientSender

    {

        
int HookAndSendMessage(string userID ,NetMessage msg) ;    //返回DataSendResult的常量

    }

    tcpUserManager是用户管理者组件,它管理了所有的在线用户。关于它的删改描述会在后文中给出。

    ToForeignClientSender通过借助IRamblesManager和AS发布的远程服务接口也实现了跨区域消息的转发。

 1         public NetMessage DealRequestMessage(NetMessage reqMsg)

 2         {

 3             try

 4             {

 5                 //从IRAS获取目标AS的地址

 6                 string serverIp = this.irasRemotingAccesser.GetAppServerIp(reqMsg.Header.TypeKey) ;    

 7                 if(serverIp == null)

 8                 {

 9                     return this.contractHelper.GetResponseByServiceResultType(reqMsg ,ServiceResultType.ServiceStopped) ;

10                 }

11                 

12                 //获取目标AS发布的远程服务句柄

13                 IAsRemotingService_4As asRemotingAccesser = (IAsRemotingService_4As)NetHelper.GetRemotingHanler(this.myConfiguration.RemotingChannelTypeStr ,serverIp ,this.myConfiguration.AsRemotingPort ,this.myConfiguration.AsRemoting4AsServiceName ,typeof(IAsRemotingService_4As)) ;

14                 if(asRemotingAccesser == null)

15                 {

16                     return this.contractHelper.GetResponseByServiceResultType(reqMsg ,ServiceResultType.ServiceStopped) ;

17                 }

18 

19                 //Hook

20                 NetMessage hookedMsg = this.netMessageHook.CaptureBeforeSendMsg(reqMsg) ;

21 

22                 //目标AS处理跨区域请求

23                 return asRemotingAccesser.DealRequestMessage(hookedMsg) ;

24             }

25             catch(Exception ee)

26             {

27                 ee = ee ;

28                 this.esbLogger.Log(ee.Message ,"ESFramework.Architecture.LBS.FourTier.ForeignDealer" ,ErrorLevel.Standard) ;

29                 return this.contractHelper.GetResponseByServiceResultType(reqMsg ,ServiceResultType.ServiceStopped) ;

400             }

31         }

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

    }

    IRamblesManager接口用于管理所有的漫游用户,它记录了每个漫游用户的当前所在区域。你你这一接口在每个AS发现漫游用户时调用。比如,当某个用户登录到上海AS,上海AS发现你你这一用户有无在上海注册的,于是,它调用IRamblesManager接口把该用户换成到漫游记录表中。你你这一漫游记录表可能居于某个公共的数据库中、也可能居于某台7*24小时运行的服务器的内存中。IRamblesManager接抽象了哪几个具体的物理实现。每个AS通过与IRamblesManager交互就都都要知道某个用户有无漫游了、以及漫游到了何地等信息。

    人们都都在配置应用时,ToClientSender的SenderList通常只含有一一个多多Sender――ToLocalClientSender和ToForeignClientSender。ToLocalClientSender在AS外部传递要转发的消息,而ToForeignClientSender跨AS传递要转发的消息。ToLocalClientSender的实现非常简单:

    对于漫游用户的支持和跨区域功能请求的支持是ESFramework最基本的目的之一(回顾),在删改讲述处理方案之后,先了解一下关于你你这一问题报告 的上下文。

    在人们都前面讲述的4层C/S架构中,每个AS负责一块区域。比如上海AS负责处理所有目标城市为上海的功能请求和管理所有在上海AS上注册的用户(比如PDA用户或手机用户)。可能一一个多多本是在上海注册的用户出差来到了武汉,最方便的,他会连上武汉的AS,越来越 对于武汉AS来说,你你这一用户就说 漫游用户了。

    可能上海的用户登陆上了上海的AS,而且 他都要请求目标城市为武汉的服务,你你这一请求就说 跨区域的请求,上海AS处理不了,都要转发给武汉AS处理。

    还有你你这一情况,就说 即时消息,比如登录到上海AS的用户都要和登录到武汉AS的用户进行即时通讯,哪几个即时消息都都要在不同的AS之间进行中转,而且 最终转发给目标用户。

    ESFramework对上边的各种情况都给予了充分完善的支持。首先,人们都处理第一一个多多问题报告 ――支持漫游用户。

    单纯的支持漫游用户,非常容易做到。重要的是人们都都要为即时通讯信息作准备。当一一个多多用户想查询他的某个“好友”有无在线时,可能目标好友越来越漫游,越来越,只都要询问其注册的的AS就都都要知道答案,而且 可能其漫游到异地AS了了?难道人们都都要去轮询成千上万个AS中的每一一个多多吗?越来越 的强度是无法忍受的。ESFramework是通过引入IRamblesManager接口处理你你这一问题报告 。

 1         public int HookAndSendMessage(string userID ,NetMessage msg)

 2         {

 3             bool onLine = this.tcpUserManager.IsUserOnLine(userID) ;

 4             if(onLine)

 5             {

 6                 int connectID = this.tcpUserManager.GetUserConnectID(userID) ;

 7                 this.hookSender.HookAndSendNetMessage(connectID ,msg) ;

 8                 return DataSendResult.Succeed ;

 9             }    

10         

11             return DataSendResult.UserIsOffLine ;

12         }

    关于“支持漫游用户和跨区域功能请求”,本文就说 对主要的偏离 作了讲述,还有好多好多 小的细节无法在这里全面展开。可能也太久了解并使用ESFramework框架来帮你搭建应用,了解哪几个就足够了:)感谢关注!

上一篇文章:ESFramework介绍之(16)―― Tcp数据自动发送器ITcpAutoSender

    ESFramework中的IToClientSender实现是ToClientSender,它都都要含有一组具体的Sender,每次发送消息时,ToClientSender会按照指定的顺序调用每个Sender,知道有一一个多多发送成功为止。ToClientSender实现如下:

    上边的代码和注释可能非常清楚了说明了跨区域请求是如保被处理的,这里就不赘言了。就说 都要注意,所有的功能请求有无通过远程服务接口提供服务的。

    

    最后,说一说上边描述上下文时提到的第你你这一情况,AS是如保处理即时通讯消息的?即时通讯消息在ESFramework种称为P2PMessage,对于P2PMessage当然有无对应的消息处理器P2PMessageDealer,它负责将P2PMessage转发给指定的目标用户。P2PMessageDealer的工作土办法如下,可能发现目标用户就在本地AS上,则直接转发。可能目标用户是异地用户可能可能漫游到异地,则将消息转发到目标AS上。P2PMessageDealer的实现借助了IToClientSender接口,IToClientSender接口向应用屏蔽了底层的消息转发过程,其定义如下:

    处理了漫游用户后,人们都现在转向第六个问题报告 ,如保支持跨区域的功能请求?

    前面的系列文章可能讲到,所有的功能请求有无通过消息处理器来处理的,对于跨区域的功能请求,ESFramework提供了跨区域的功能处理器来处理。其仍然实现了IDataDealer接口。下面列出跨区域功能处理器的DealRequestMessage土办法的实现代码:

 1         public int HookAndSendMessage(string userID, NetMessage msg)

 2         {

 3             try

 4             {

 5                 int userCurCityCode = this.ramblesManager.GetUserCurrCityCode(userID) ;

 6                 if(this.myConfiguration.CityCode == userCurCityCode)

 7                 {

 8                     return DataSendResult.UserIsOffLine ;

 9                 }

10 

11                 string destAppServerIp = this.irasRemotingAccesser.GetAppServerIp(userCurCityCode) ;

12                 if(destAppServerIp == null)

13                 {

14                     return DataSendResult.UserIsOffLine ;

15                 }

16 

17                 IAsRemotingService_4As asRemotingAccesser = (IAsRemotingService_4As)NetHelper.GetRemotingHanler(this.myConfiguration.RemotingChannelTypeStr ,destAppServerIp ,this.myConfiguration.AsRemotingPort ,this.myConfiguration.AsRemoting4AsServiceName ,typeof(IAsRemotingService_4As)) ;

18                 if(asRemotingAccesser == null)

19                 {

20                     return DataSendResult.UserIsOffLine ;

21                 }

22 

23                 NetMessage hookedMsg = this.netMessageHook.CaptureBeforeSendMsg(msg) ;

24                 return asRemotingAccesser.HookAndSendMessage(userID ,msg) ;    

25             }

26             catch(Exception ee)

27             {

28                 ee = ee ;

29                 this.esbLogger.Log(ee.Message ,"ESFramework.Architecture.LBS.FourTier.ToForeignClientSender" ,ErrorLevel.Standard) ;

400                 return DataSendResult.FailByOtherCause ;

31             }

32         }

33