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

  • 时间:
  • 浏览:1
  • 来源:神彩大发11选5_彩神大发11选5官方

    当亲们在配置应用时,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 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) ;

200             }

31         }

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

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

    上面的代码和注释肯能非常清楚了说明了跨区域请求是如可被补救的,这里就不赘言了。只是需用注意,所有的功能请求都有 通过远程服务接口提供服务的。

    

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

    }

    关于“支持漫游用户和跨区域功能请求”,本文只是对主要的每项作了讲述,还有只是小的细节无法在这里全面展开。肯能只是要了解并使用ESFramework框架来帮你搭建应用,了解那此就足够了:)感谢关注!

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

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

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     }

 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) ;

200                 return DataSendResult.FailByOtherCause ;

31             }

32         }

33 

    补救了漫游用户后,亲们现在转向第二个疑问,如可支持跨区域的功能请求?

    前面的系列文章肯能讲到,所有的功能请求都有 通过消息补救器来补救的,对于跨区域的功能请求,ESFramework提供了跨区域的功能补救器来补救。其仍然实现了IDataDealer接口。下面列出跨区域功能补救器的DealRequestMessage法律依据的实现代码:

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

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

    /// <summary>

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

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

    
/// </summary>

    public interface IToClientSender

    {

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

    }

 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         }

猜你喜欢

剑魔独孤求败小说txt全集免费下载

展开全版扫描二维码下载收起更多回答(1)换一换免费的,直接下载就行剑魔独孤求败txt全集小说附件已上传到百度网盘,点击免费下载:展开全版发私信了,不懂的再问我下载百度知道AP

2020-02-28

【急】女生学考古系有前途吗?就业难吗?需要克服的问题有什么?

不一定的,冷门只是 是因为用世俗的眼光看,社会尚未过度关注。事实上,越是热门的,越是千军万马过独木桥,越是冷门的,越没法学校跟风竞争,竞争的毕业生越少,越容易好在行业内就业。

2020-02-28

盗墓笔记里闷油瓶的来历是什么

苗族首领为哪几种要刺瞎陈皮阿四的眼睛?是是不是他看到哪几种被委托人不该看的东西?是不以后那枚蛇眉铜鱼?还有,朋友儿否其他同学太好云彩和闷油瓶前一天就认识和熟悉?阴山古楼这一

2020-02-28

机器学习实战篇——用卷积神经网络算法在Kaggle上跑个分

这是本问最难的每项,作用实际上要是对数据进行避免,转加带TensorFlow读得懂的数据。从AI学习笔记——卷积神经网络(CNN)的文章中大伙儿儿知道,一张图片有有一几个 维

2020-02-28

文艺复兴时期中国是什么朝代

展开完整性明朝(1368年―1644年)是中国历史上最后另2个 由汉族建立的大一统王朝,共传十六帝,享国二百七十六年。文艺复兴(Renaissance)是指趋于稳定在14

2020-02-27