XMPP服务器的选型

55 sec read

XMPP Server方案简介

XMPP Server拥有众多的实现方案:

xmpp-server

其中,较为成熟,且使用广泛的是ejabberd, jabberd 2.x, Openfire, Tigase(蓝底标出). 这几个Server的详细比较可以参考这两篇文章:Choosing An XMPP Server, Android Push 开源方案解析. 以上两篇文章的结论如下:

  • Jabberd 2.x 使用C语言实现,但是,存在着数据库事务的滥用、内存泄露、不一致的非阻塞设计等问题,最重要的是该server已经很长时间没有人维护;因此,chesspark在使用jabberd 2.x三年后,转用ejabberd。无独有偶,org也在2010年淘汰Jabberd, 转为使用ejabberd.
  • Openfire以及Tigase都是基于JAVA的解决方案。但是极光推送团队认为,Openfire单机并发很有限,集群方案不成熟,代码古老而缺乏及时更新,因此不适合应用在生产环境中。因此,极光团队在初期使用Tigase解决方案。但是在使用中发现,Tigase其集群方案实现复杂,单节点容量有限,后期转为自己开发

 

从编程语言角度看,主流的XMPP Server主要是JAVA和Erlang。JAVA语言的优势是类库完备,容易招人。Erlang的优势是hot code swap, live console, 高并发。ejabberd与Openfire/Tigase比较而言,最大的优势是相对优雅的集群方案以及更高的并发性能。在没有语言偏向性的情况下,一般在开发初期都会选用ejabberd, 如WhatsApp, Facebook Chat, 米聊

 

从各种XMPP Server支持的特性看,ejabberd是对XMPP协议支持最好、实现最为全面的server。

从开源协议看,Tigase采用AGPL开源协议,因此只要有代码修改,就必须对代码进行开源。Openfire采用Apache开源协议,修改代码后可以闭源。ejabberd采用GPL v2开源协议,如果只在服务端提供服务,而不进行代码二次分发,修改代码以后也可以「闭源」,参考

 

综合以上各因素,Chat Service采用ejabberd作为初期的XMPP Server.

可以查看这些server的状态及基本信息(实现方式、认证方式等)。

ejabberd

  • ejabberd是一个用Erlang/OTP语言写的自由和开源的即时消息服务器
  • ejabberd是跨平台,分布式, 容错, 并基于开放标准的实时通讯系统
  • ejabberd的设计坚若磐石,是一个功能服丰富的XMPP服务器
  • ejabberd同时适合小规模布署和超大规模布署, 无论它们是否需要可伸缩性

关键功能

ejabberd是:

  • 跨平台的: ejabberd可以运行在Microsoft Windows和Unix派生系统,例如Linux, FreeBSD和
  • 分布式的: 你可以在一个集群的机器上运行ejabberd,并且所有的机器都服务于同一个或一些Jabbe域. 当你需要更大容量的时候,你可以简单地增加一个廉价节点到你的集群里. 因此, 你不需要买一个昂贵的高端机器来支持上万个并发用户.
  • 容错: 你可以布署一个ejabberd集群,这样一个正常运行的服务的所有必需信息将被复制到所有节点. 这意味着如果其中一个节点崩溃了, 其他节点将无中断的继续运行. 另外, 也可以‘不停机’增加或更换节点.
  • 易于管理: ejabberd建立于开源的 所以你不需要安装外部服数据库, 外部web服务器, 除此以外因为每个东西都已经包含在里面, 并且处于开箱可用状态. 其他管理上的好处包括:
    • 详尽的文档.
    • 便捷的安装程序,包括在Linux, Mac OS X, 以及Windows系统下.
    • Web管理.
    • 共享名册组.
    • 命令行管理工具.
    • 可外部集成的验证机制.
    • 发送匿名消息的能力.
  • 国际化: ejabberd领导国际化. 非常适合全球化. 相关功能包括:
    • 翻译成25种语言.
    • 支持IDNA.
  • 开放标准: ejabberd是的一个完全支持XMPP标准的开源Jabber服务器.
    • 完全兼容
    • 基于XML的协议.
    • 支持的协议很多.

额外功能

而且, ejabberd广泛支持的其他先进特性:

  • 模块化
    • 只装在你想要的模块.
    • 在你自己的自定义模块扩展
  • 安全性
    • 支持c2s和s2s连接的SASL和
    • 支持s2s连接的STARTTLS和
    • 可通过HTTPS安全访问的Web管理.
  • 数据库
    • 快速布署的内部数据库(Mnesia).
    • 原生的MySQL支持.
    • 原生的PostgreSQL支持.
    • 支持ODBC数据存储.
    • 支持Microsoft SQL Server.
  • 验证
    • 内部验证.
    • PAM, LDAP 和
    • 外部验证脚本.
  • 其他

参考链接:

OpenFire

我们要了解Openfire,首先要了解XMPP协议,因为Openfire是用Java语言编写的,基于XMPP协议、开源的实时协作的服务器。Openfire具有跨平台的能力,Openfire与客户端采用的是C/S架构,一个服务器要负责为连接在其上的客户端提供服务。Openfire客户端有spark, pidgin, Miranda IM, iChat等,用户如果自己开发客户端,可以采用遵循GPL的开源Client端API–Smack。Openfire服务器端支持插件开发,如果开发者需要添加新的服务,可以开发出自己的插件后,安装至服务器,就可以提供服务,如查找联系人服务就是以插件的形式提供的。

OpenFire 是采用Java开发的基于XMPP(Jabber)协议,开源实时协作(RTC)服务器。Smack 是用 Java编写的XMPP客户端代码库,是spark的核心,开源界总是有许多有趣的东东,这三个合起来就是一个完整的XMPP IM 实现。

  • OpenFire ——服务器端
  • Spark——客户端
  • Smack——XMPP 传输协议的实现

三者都是基于Java 语言的实现,其中XMPP是一个协议,协议是需要实现的,Smack起到的就是这样的一个作用。

OpenFire 是基于XMPP 协议的IM 的服务器端的实现,虽然当两个用户连接后,可以通过点对点的方式来发送消息,但是用户还是需要连接到服务器来获取一些连接信息和通信信息的,所以服务器端是必须要实现的。

Spark 提供了客户端一个基本的实现,并提出了一个很好的插件架构,这对于开发者来说不能不说是一个福音。我强烈建议基于插件方式来实现你新增加的功能,而不是去改它的源代码,这样有利于你项目架构,把原始项目的影响降到最低。

Smack 是一个XMPP 协议的Java 实现,提供一套可扩展的API,不过有些时候,你还是不得不使用自己定制发送的XML 文件内容的方式来实现自己的功能

三者之间的关系:

openfire

从上图可知,Client 端和Server端都可以通过插件的方式来进行扩展,Smack是二者传递数据的媒介。

Openfire服务器容量

单台Openfire服务器支持3K以上的容量应该是没有问题,但更多的则需要测试。开源版本的不支持Clustering,但我们可以采用Openfire + Connection Manager来扩充服务器容量,有网友测试,在1台8G内存的Openfire服务器上,如果配置好Connection Manager,可以支持到30万用户。 我们可以来算算Openfire + Connection Manager服务器的大概容量。假设一个Connection Manager与Openfire之间各占用20连接,每个Openfire服务器可支持5000个连接,每个Connection Manager可支持3000个连接,如果我们配置4个Connection Manager,则我们可算出Openfire服务器的容量:1*5000-4*20+4*3000-4*20 = 16840。我们做了一个测试,在虚拟机上运行Openfire3.7.0,可以同时登录2W个用户,在加上Clustering之后,只有1W6了。

参考资料:http://www.igniterealtime.org/projects/openfire/

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

使用Python更换外网IP

在进行数据抓取时,经常会遇到IP被限制的情况,常见的解决方案是搭建代理IP池,或购买IP代理的服务。除此之外,还有一个另外的方法就是使用家里的宽带网络进行抓取。由于家里的宽带每次断开重新连接时都会分配一个新的IP,所以在我们抓取数据的时候,判断 ...
36 sec read

Python多线程与多进程

7 min read

Python Requests 抓取失败时的重试设置

最近在抓取数据的时候,经常遇到连接超时的问题,分析原因居然是DNS污染导致的,为了让程序更加稳健,需要对requests请求实现失败重试的逻辑。
2 min read

Leave a Reply

Your email address will not be published. Required fields are marked *