推送与IM即时聊天可行性分析报告与解决方案汇总

推送与IM即时聊天可行性分析报告与解决方案汇总

 

第一部分:理论分析

1、前言

       目前市面上有不少第三方推送与IM即时聊天解决方案,如腾讯信鸽、极光推送、网易云信等第三方平台,可是这些平台有时并不能知足咱们的需求,好比要求咱们的系统必须部署到内网环境等状况,或者出于公司知识产权等考虑,这时咱们就不得不本身想办法搭建推送服务器。java

 

2、自建推送/IM服务器要考虑的问题

       随着社交应用的普及,人们对即时聊天的要求也愈来愈高,截止2017年上半年为止,我大概总结了一下,一个基本的聊天应用起码要考虑到如下几点才算是一个可用的方案:android

  • QoS,对于传送质量的要求:未成功发送的消息如何保证送达?重试时如何保证不重复送达?
  • 实时网络监测:如何在链接已断开时及时通知用户?
  • 数据持久化:聊天记录如何保存?
  • 消息队列:一次发送多条消息时如何保证有序到达?
  • 发送回执与状态显示:只有在发送成功状况下消息才不显示任何额外标识,不然在发送过程当中要显示Loading图标,发送失败后要显示感叹号图标,全部这些是否可经过监听发送回执来作到?推送服务器是否支持发送回执?

 

3、推送实现的可选方式

(1)本身写socket长链接:

       其实不少人建议咱们在手机端本身写一个socket长链接,而后采用轮循的方式不断从推送服务器去取数据,不能否认早些年在移动互联网刚开始发展的阶段这确实是一种解决方案,那时候没有成熟的协议,没有成熟的组件,也没有解决以上第二点中提出的那么多须要注意的点。并且随着时代的发展,这种方式的缺点也愈来愈明显,最要命的是它耗电、耗流量、耗系统资源,并且还不稳定,若是用户量达到必定数量服务端是绝对受不了了几万台终端同时用这种方式轮循的。git

(2)使用官方推送渠道:

       对于苹果手机来讲,推送的实现方式比较简单,苹果公司统一提供了全局惟一的socket长链接,全部应用共享这一链接,全部推送也都通过这个链接来推送,开发人员只须要接入苹果的APNs便可。其实对Android手机来讲,也有相似的实现方式,Google公司仿照苹果公司的模式也为Android操做系统提供了相似的“官方”推送服务器,叫作谷歌云消息系统(Google Cloud Messaging,简称GCM),可是因为要链接Google的服务器,众所周知的缘由,这一服务没法在国内使用,若是咱们想实现包括Android在内的全平台的统一推送服务,就要另想办法了。github

(3)根据已有的成熟的推送协议自已搭建标准的推送服务器:

       其实除了本身写socket长链接和使用官方渠道以外,目前已经有不少成熟的推送协议可供选择,比较流行的几种即时通讯协议为ddpush、xmpp和mqtt,有关这几种推送协议的优缺点有一篇文章你们能够参考一下:数据库

《总结ddpush、xmpp、mqtt在作推送的时候的选择》,连接:后端

http://blog.csdn.net/languobeibei/article/details/56288947缓存

 

4、选择哪一种协议

(1)功勋元老xmpp协议:

       其实xmpp协议在手机早期发展阶段用的仍是比较多的,在Android 2.X时代咱们就曾经使用过这种协议,在实现xmpp协议的服务器框架中,最著名的当属Openfire,咱们只须要下载Openfire的安装包并安装部署到咱们的Linux主机,并作简单的配置就可使用了,可是这种协议其实已经不在适合今天的互联网世界,其xml格式的报文相对冗余,且没有对消息传输质量等方面作详细的规定,如今已经不多使用。tomcat

(2)互联网与物联网行业的新星:mqtt协议

       因为xmpp协议有各类不足,IBM公司推出的mqtt协议在近些年愈来愈受欢迎,这种协议使用二进制流进行传输,内容冗余很是少,并且mqtt协议不只仅规定了报文格式,还对消息质量、消息持久化等方面作了详细规定,并且支持服务器的桥接,对于多台服务器联合部署也比较方便,特别适合今天作为IM即时聊天的解决方案,所以,咱们推荐使用mqtt协议来实现咱们的推送方案。安全

 

5、mqtt协议简介

       其实不管是xmpp协议仍是mqtt协议,都是基于tcp协议封装的应用层协议,在访问时都是能过tcp://的格式来链接服务器。服务器

       Mqtt协议基于发布/订阅模式来构建,实现了消息发送端和接收端的解耦,咱们可使用这种模式来构建点对点的聊天,也能够轻松构建一个群聊,发送端发布一个话题(topic),接收端订阅(subscribe)这个topic便可,而且mqtt协议提供了消息质量的支持,当QoS的等级为2时,发送端和接收端能够经过屡次握手的方式实现消息有且仅一次送达,即便是接收端离线也能够实现离线消息的正确接收,咱们能够配置服务器将离线消息缓存到内存或者数据库中,这些内容在mqtt协议中都作了明确规定。

       在传输安全方式,mqtt协议也明确规定了SSL/TLS的传输方式,若是有安全传输的需求也能够知足。

       在数据持久化方面,mqtt协议明确规定了消息可存放于内存或数据库中,而且开放给开发人员自由选择。

 

第二部分:实战

1、基于mqtt协议的Apollo服务器和mosquitto服务器的安装与配置

       近年来关于mqtt的相关文档也愈来愈丰富,针对mqtt的服务器组件也愈来愈多,比较著名的有Apache基金组织的ActiveMQ Apollo和eclipse公司推出的mosquitto,拿mosquitto来讲,咱们只须要到http://mosquitto.org下载相应的安装包,并安装到咱们的Linux主机就能够搭建一台基于mqtt协议的推送服务器,关于如何安装部署mosquitto服务器,网上有大量的文章可供参考,apollo服务器的下载安装也有不少文章介绍,你们能够自行百度,这里能够推荐两篇文章:

Mosquitto的下载及安装:

http://blog.csdn.net/xukai871105/article/details/39252653

Apollo的下载及安装:

http://blog.csdn.net/qq_29196551/article/details/51488340

 

2、开发API的选择

       其实通过前边选择协议并安装服务器,咱们的推送服务已经算是搭建好了,至于如何访问这个mqtt服务器是客户端要作的事情了,只要咱们按照mqtt规定的方式链接推送服务器就能够了,可是因为mqtt协议规定的细节相对比较多,若是咱们硬编码的话工做量仍是比较大的,好在已经有人为咱们封装过这些API了,这里推荐使用eclipse公司的paho,官网地址是http://www.eclipse.org/paho/,paho提供了多种语言的实现,包括Java、Android、Python、JavaScript、.Net(C#)、C/C++等实现,若是使用PHP语言也能够参考tokudu-PhpMQTTClient,若是考虑到兼容苹果手机,能够参考这篇文章:

《MQTT 协议(三):实战篇》

http://www.jianshu.com/p/b093fe6c3f10?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=qq

       这篇文章介绍了用 Objective-C 封装的 MQTT 框架:MQTT-Client-Framework的使用,这样咱们就可使用一台推送服务器兼容Android和IOS两大平台了,我猜苹果的这套框架底层应该也是经过苹果的APNs来链接的。

 

Paho的官网也给出了各类实现方式的样例,好比Java的Demo在Github中的网址为:

https://github.com/eclipse/paho.mqtt.java

Android的代码样例为:

https://github.com/eclipse/paho.mqtt.android

在Android的样例中,eclipse公司还给出了一个现成的mqtt服务器地址

tcp://iot.eclipse.org:1883

若是想先看看效果,暂时没空搭建mqtt服务器的话,可使用这个服务器来作一些演示。

 

3、容易混淆的概念:服务器、客户端

       以前查询了不少有关搭建推送服务器的资料,发现不少朋友都忽略了几个最最基本的概念,什么叫服务器?什么叫客户端?因此我认为有必要在文章的最后对这个概念进行一些说明。

       其实在传统的手机APP开发当中,咱们通常把手机称做客户端,把给手机提供http接口的后端称做服务器,服务器能够由基于SpringMVC的Java来构建,也能够由PHP、Python等语言构建。

       可是在推送服务器的领域,我认为有必要澄清一下“服务器”的概念,在这个领域里,只有一个东西能够被称为服务器,就是负责推送的那台“推送服务器”,除此以外其它全部的设备在它看来都是客户端,理论上讲,咱们只须要搭建一个mosquitto或Apollo服务器,再用几台手机经过mqtt协议链接到这台服务器就能够实现即时聊天了,而咱们所谓的Java服务器后台、PHP服务器后台则彻底能够不要。

       而若是咱们须要经过咱们本身的服务器管理后台给手机用户推送消息时,咱们就能够在咱们Java服务端代码中引入paho API(假设咱们的服务端用Java EE来实现),这时咱们的tomcat服务器也就能够链接mqtt服务器了,而对于mqtt服务器来讲,这个tomcat服务器跟Android手机是同样的,它只是一个普通的客户端,mqtt服务器甚至不知道链接它的是一台手机仍是一台部署了tomcat的Linux主机,mqtt服务器只知道有一台设备请求发布消息,那么就把这条消息推送给订阅了这一主题的设备,仅此而已,mqtt服务器、管理后台服务器和终端的关系以下图所示:

相关文章
相关标签/搜索