openfire外部组件的编写-这玩意干啥用的?

既然已经开始写了,那就趁热再写一段。

从97年开始用了互联网之后,对于写博客啥的完全没兴趣,不过考虑到知识的积累和教学的需要,我还是把一些和手上业务相关的技术以及解决方案写下来,说不定论文还用的上:)

外部组件我打算分几部分来写,首先我想说说这玩意是啥。

说到这玩意,我先说一下几年前做的一个实验。

当时是打算在web和手机实现一个互通的游戏,打算用flash来开发,这样快速发布到不同的平台会比较平滑,在选择tcp服务器的时候仔细考察了很多产品,最后还是选择了开源的red5,在red5上开发插件的工作是我的一个弟兄完成的,代码我也大概看了一下,基本上就是按照插件的生命周期,实现客户端和服务器端的握手,登录,数据交换,远端方法调用,回调等逻辑。

对于一个单个游戏或者说实验来说,没有问题,但是如果要实现game zone,房间,或者多种游戏,就要编写多个插件,通过scope的方式来实现在同一个服务器上的独立业务逻辑。所以再回到xmpp上,我们所说的外部组件就是实现了xep-0060也就是pub-sub架构的扩展程序。由于pub-sub是基于node的,因此具有非常好的可扩展性。事实上,xmpp就是因为这个而被广泛应用。

所以,基于以上的介绍,我们必须首先意识到,外部组件,是一个node的业务实现,而不是对xmpp服务器的扩展。


外部组件和服务器的连接是通过特定的端口和口令,那么我们首先需要在openfire上允许外部组件


如图,我们开启了5275端口,口令为共享的123456来接入外部组件。

如果我们最终完成了组件并且和服务器通过这个端口连接之后,可以在会话中看到,如下图是目前正在运行的外部组件:


本文我不打算提及外部组件的编写,我们还是回过头来继续说,这玩意是啥,能做啥。

还是用那个几年前的实验来说吧,假如这一次,我们选择了openfire和xiff来开发游戏,很好,外部组件将会提供不同游戏的服务器端业务逻辑,xiff是flash上的xmpp api

我们会将每一个游戏首先定义一个子域,服务器主域为example.com,例如掼蛋,我们定义子域为guandan.example.com,麻将为majiang.example.com。

接下来我们就需要为这个游戏设定一系列基本对象,zone,room,table

我们分别将区域,房间和桌子定义为服务器端的三个集合,接下来,还要为房间和桌子设定代理用户。

为什么要实现代理用户,因为当用户在房间里说话,这时候他还没有入座和开始游戏,那么其实就相当于群聊

我们实现的房间代理用户,就是对房间内用户聊天数据的转发,例如,游戏掼蛋room0这个房间有4个用户,分别是user0到user3,其中user0说了“hello”,那么他实际上是对房间代理说了“hello”,房间代理将这句话转发给user1-3。对应这样的逻辑,我们的房间代理JID就是room0@guandan.example.com。需要说一下,用户的JID分别是user0-4@example.com,用户连接openfire的时候必须利用服务器主域的JID,而room0@guandan.example.com是一个虚拟的用户,在服务器上根本没有这个用户。

而user0说“hello”翻译称XMPP就是<message type="chat" from="user0@example.com" to="room0@guandan.example.com">

那么服务器会在room集合里查询room0里有哪些JID,然后发现user1-3存在,于是转发了消息,XMPP为

<message type="chat" from="user0@example.com" to="user1@example.com">

<message type="chat" from="user0@example.com" to="user2@example.com">

<message type="chat" from="user0@example.com" to="user3@example.com">

也许你会疑惑,组件不是只能负责子域的通信么,怎么能发出根节点的消息呢。事实上,由于外部组件和XMPP服务器的连接是经过认可的可信任关系,因此,外部组件可以组织任何形式的XMPP包,只不过外部组件不能访问到XMPP服务器上的资源,例如外部组件无法获得服务器上的用户列表。

通过上面的描述,应该不难理解,哦,原来外部组件就是写“机器人”的,没错,你完全可以这么理解外部组件。

事实上,facebook上就有不少人利用XMPP服务器和外部组件开发机器人模式的应用。

Thoughts On Scalable XMPP Bots 这篇文章就给了我挺好的启示。有兴趣的话大家可以看一下。

接下来我们再继续探讨,那么外部组件除了做机器人还能干啥。在我们的主要应用案例里,我们利用外部组件做协议转换,实现和第三方产品的通信。

在XMPP的wiki上,给出了一副例图:


从这我们可以看出,XMPP服务器的优势就是互联能力很强,对于同样基于XMPP协议的服务器之间的互联,可以直接配置服务器互联,而跨协议的互联,则有外部组件可以实现。

通过我们实际的案例,外部组件还有很多好处

首先,外部组件因为可以虚拟身份,因此对于好友关系的维护可以非常的个性化,而不用采用原有XMPP的roster的设计,因为某些应用场景下,roster是非常的繁琐

一个企业有500人,对于企业内部,500人的状态应该大家互相知道,那么按照xmpp服务的roster设计,必须互为roster,那么服务器就维护了一个巨大的roster信息,而在外部组件的帮助下,我们可以通过代理的方式完成。我们虚拟一个子域用户,这个用户订阅了500人,而这500人也只需要订阅1人,这样整个服务器需要维护的roster数据就小了500倍。

第二,由于外部组件的工作模式是独立的应用程序,那么就可以不用和XMPP服务器部署在同一台设备,因此极大的扩展的系统的性能,我们放开openfire的集群不说,通过外部组件就可以实现某种程度上的负载均衡,配合DNS端的负载均衡,外部组件和openfire可以编织一张巨大的网来承载大型的业务。

第三,外部组件的实现是XMPP协议定义的,因此不受openfire内部组件只能用java开发的限制,事实上现在用python开发外部组件也很流行,如果将xmpp服务器换成用erlang编写的ejabberd,可以大幅提升并发的处理能力。

第四,让EAI更加简单,企业应用集成是一个很大的话题,不过借助外部组件和xmpp也未尝不是一种解决方案。

所以通过上面的叙述,大家应该可以大概理解外部组件是个什么玩意,并且这玩意能做啥,那么从下一篇开始,我就带着大家一起来编写外部组件。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值