移动IM开发指南1:如何进行技术选型

《移动IM开发指南》系列文章将会介绍一个IM APP的方方面面,包括技术选型、登录优化等。此外,本文做者会结合他在网易云信多年iOS IM SDK开发的经验,深度分析实际开发中的各类常见问题。安全

 

推荐阅读服务器

移动IM开发指南2:心跳指令详解网络

移动IM开发指南3:如何优化登陆模块架构

 

 

通信方式选择并发

IM通信方式无非两种选择:设备直连(P2P)和经过服务器中转。负载均衡

(1)P2Pide

P2P多见于局域网内聊天工具,典型的应用有:飞鸽传书等。这类软件在启动后通常作两件事情:工具

  1. 进行UDP广播:发送本身信息和接受同局域网内其余端信息
  2. 开启TCP监听:等待其余端进行链接

详细的流程能够参考飞鸽传书源码。可是这种方式在有种种限制和不便:一方面它只适合在线的点对点消息传输,对离线,群组等业务支持不够。另外一方面因为 NAT 的存在,使得不一样局域网内机器互联难度大大上升,在某些网络类型(对称NAT)下没法创建链接。优化

(2)服务器中转网站

几乎全部互联网IM产品都采用服务器中转这种方式进行消息传输,相对于P2P的方式,它有以下的优势:

  1. 可以支持更多P2P没法支持或支持很差的业务,如离线消息,群组,聊天室服务
  2. 方便业务逻辑的拓展和新旧版本的兼容

固然它也有本身的问题:服务器架构复杂,并发要求高。

 

网络链接方式

IM主流网络链接方式有两种:

  1. 基于TCP的长链接
  2. 基于HTTP短链接PULL的方式

后者常见于WEB IM系统(固然如今不少WEB IM都是基于WebSocket实现),它的优势是实现简单,方便开发上手,问题是流量大,服务器负载较大,消息及时性没法很好地保证,对大规模的用户量支持不够,比较适合小型的IM系统,如小网站的客户系统。

基于TCP长链接则可以更好地支持大批量用户,问题是客户端和服务器的实现比较复杂。固然也还有一些变种,以下行使用MQTT进行服务器通知/消息的下发,上行使用HTTP短链接进行指令和消息的上传。这种方式可以保证下行消息/指令的及时性,可是在弱网络下上行慢的问题仍是比较严重。早期的来往就是基于这种方式。

 

协议选择

IM协议选择原则通常是:易于拓展,方便覆盖各类业务逻辑,同时又比较节约流量。后一点的需求在移动端IM上尤为重要。

常见的协议有:XMPP;SIP;MQTT;私有协议。

  1. XMPP协议的优势在于:协议开源,可拓展性强,在各个端(包括服务器)有各类语言的实现,开发者接入方便。

可是缺点也是很多:XML表现力弱,有太多冗余信息,流量大,实际使用时有大量天坑。

  1. SIP协议多用于VOIP相关的模块,是一种文本协议,因为我并无实际用过,因此不作评论,但从它是文本协议这一点几乎能够判定它的流量不会小。
  2. MQTT的优势是协议简单,流量少,可是它并非一个专门为IM设计的协议,多使用于推送。
  3. 市面上几乎全部主流IM APP都是使用私有协议,一个被良好设计的私有协议通常有以下优势:高效,节约流量(通常使用二进制协议),安全性高,难以破解。缺点则是在开发初期没有现有样列能够参考,对于设计者的要求比较高。

一个好的协议须要知足以下条件:高效,简洁,可读性好,节约流量,易于拓展,同时又可以匹配当前团队的技术堆栈。基于如上原则,咱们能够推出: 若是团队小,团队技术在IM上积累不够能够考虑使用XMPP或者MQTT+HTTP短链接的实现。反之能够考虑本身设计和实现私有协议。

 

私有协议的设计

  1. 序列化选择

移动互联网相对于有线网络最大特色是:带宽低,延迟高,丢包率高和稳定性差,流量费用高。因此在私有协议的序列化上通常使用二进制协议,而不是文本协议。常见的二进制序列化库有protobuf和MessagePack,固然你也能够本身实现本身的二进制协议序列化和反序列的过程,好比蘑菇街的TeamTalk。可是前面两者不管是可拓展性仍是可读性都完爆TeamTalk(TeamTalk连Variant都不支持,一个int传输时固定占用4个字节),因此大部分状况下仍是不推荐本身去实现二进制协议的序列化和反序列化过程。

  1. 协议格式设计

基于TCP的应用层协议通常都分为包头和包体(如HTTP),IM协议也不例外。包头通常用于表示每一个请求/反馈的公共部分,如包长,请求类型,返回码等。 而包头则填充不一样请求/反馈对应的信息。

一个最简单的包头能够定义为

以心跳包为例,假设当前的serial为1,心跳包的command为10,那么使用MessagePack作序列化时:length=4,serial=1,command=10,code=0,每一个字段各占一个字节,包体为空,仅须要4个字节。

固然这是最简单的一个例子,面对真正的业务逻辑时,包体里面会须要塞入更多地信息,这个须要开发根据本身的业务逻辑总结公共部分,如为了兼容加入的协议版本号,为了负载均衡加入的模块id等。

 

上面就是IM系统大体的选型过程,包含了通信方式,链接方式,协议选择,协议设计。可是实际开发过程当中还有大量的问题须要处理。《移动IM开发指南》系列文章第二篇将会为你们解答实际开发中的常见问题。

相关文章
相关标签/搜索