openfire的session与路由机制(一)问题域分析

来源:互联网 发布:小学生英语伴读软件 编辑:程序博客网 时间:2024/05/16 08:06


在阅读和理解源码或对某个领域的架构进行探究之前时,首先要做的一个工作是熟悉用例场景及过程中的问题主体,深刻认识核心的概念,确定问题边界。

“要做好架构所首先必须具备的能力,就是能够正确的认识概念,能够发现概念背后所代表的问题,进而才能够认识目标领域所需要解决的问题,这样才能够为做好架构打好基础。在任何一个领域都是适用的,比如我们如果想要学习一项新的技术,如Hibernate、Spring、PhotoShop、WWW、Internet等等,如果知道这些概念所要解决的问题,学习这些新的技术或者概念就会如虎添翼,快速的入手;学习一个新的领域,也会非常的快速有效;使用这些概念来解释问题,甚至发明新的概念都是很容易的事。为什么强调这个呢,因为做架构的时候,很多时候都是在一个新的领域解决问题,必须要快速进入并掌握这个领域,然后才能够正确的解决问题。”(引自架构漫谈(二):认识概念是理解架构的基础)。同样地,要深入探究openfire的session和路由机制之前,我们先来简单地认识以下几个问题域的描述:

 

Im领域要解决的一个核心基本问题是:用户双方之间的信息收发。为了解决这个问题,不管是发送方客户端还是接收方客户端都和服务端有一个业务层的会话链接(即ClientSession会话),通信双方的服务基础都要以服务端为依托。即便用户双方之间可以直接通信,信息不通过服务端进行中转,用户双方也需要通过服务端来了解到对方的通信地址来建立通信链路,此之谓带外传输。信息需要通过服务器中转达到用户双方通信称为带内传输,绝大部分场景都是使用带内传输。用户客户端必需和服务端进行会话,由此我们可以找到第一个核心的概念:Session(会话)

 

Session

为了便于理解im通信中的Session概念,我们可以类比web中的session概念。

用户客户端与服务端的会话有不同的层次,基本上可分为较为底层的通信层的会话(如openfire中的Connection接口)和业务逻辑层的会话。在im通信领域,通信层的会话主要解决与业务无关的通信链路的问题(比如通信的主机信息、链路的压缩或加密机制、链路的状态、报文的发送等);业务层的会话针对不同业务场景会有不同的会话类型,业务层的会话包含了通信层会话的功能。

 

路由、路由器与路由表

对于带内传输,即用户双方通信的信息通过服务器中转,服务端不得不面对的主要问题是:如何把收到的报文转给接收方。为了解决这个核心问题,服务端必需找到正确的接收方客户端并中转报文给它(们),我们把这个过程称作路由

我们先以点对点发送消息报文(Message)为例,首先发送方客户端和接收方客户端都和服务端有一个业务层的会话链接(即ClientSession会话),Message本身携带了发送方和接收方的标识,同时服务端保存了所有在线客户端的会话信息(包含标识),这样服务端就能从Message中获取接收方的标识,通过标识进行匹配获取接收方的会话,通过会话对象(业务层会话对象通过调用通信层的会话进行报文的发送)进行下一步的路由中转。



服务端保存所有在线的会话信息的容器结构就称为路由表,从上面的Message路由场景我们可以很容易地想到能满足需求的数据结构是map,客户端的标识即为map结构的key,客户端的会话对象为map的value(但openfire实际上的实现却有所出入,在后续RoutingTable接口介绍中有所交代)。

 

XMPP协议中定义了三种类型的XML节(stanza),Message是其中的一种,而对于其它类型的报文,路由的过程有所差异。所以为了处理不同业务场景类型的报文,引入了路由器的概念,针对三种类型的XML节的路由器封装了特定业务的路由流程。




2 0