P2P办法多用于局域网内谈天,这种办法在有各类限定和不便。一方面它只适宜在线的点对点传输,对离线,群组等支持不足。另一方面由于 NAT 的存在,使得不同局域网内机器互联难度大大上升,在某些网络类型(对称NAT)下无法建立连接。利用P2P办法的软件在启动后一样平常做两件事情:
1、进行UDP广播:发送自己信息和接管同局域网内其他端信息。
2、开启TCP监听:等待其他端进行连接。

②做事器中转办法
大部分的互联网IM产品都采取做事器中转这种办法进行传输,相对付P2P的办法,具有有以下的优点:
1、支持更多P2P无法支持或支持不好的业务,如离线,群组,谈天室。
2、方便业务逻辑的拓展和新旧版本的兼容,当然它也有自己的问题,便是做事器架构繁芜,并发哀求高。
通过以上的比较,建议我们在开拓IM系统的时候利用做事器中转的办法。
(2)网络连接办法
IM的网络连接办法有基于TCP的长连接和基于HTTP短连接两种:
①基于TCP的长连接
基于TCP长连接则能够更好地支持大批量用户,问题是客户端和做事器的实现比较繁芜。也有一些改进,比如下行利用MQTT进行做事器关照/的下发,上行利用HTTP短连接进行指令和的上传。这种办法能够担保下行/指令的及时性,但是在弱网络下上行慢的问题还是比较严重,早期的来往便是基于这种办法。
②基于HTTP短连接
常见于WEB IM系统(现在很多WEBIM都是基于WebSocket实现),它的优点是实现大略,方便开拓上手,问题是流量大,做事器负载较大,及时性无法很好地担保,对大规模的用户量支持不足,适宜小型的IM系统。
(3)通讯协议办法IM常见的协议有:XMPP,MQTT,私有协议。各种协议优缺陷情形如下:
①XMPP协议
优点:协议开源,可拓展性强,在各个端(有各种措辞的实现,对付前期入门级的开拓者是很好的选择,方便进入IM开拓的程序员快速上手。
缺陷:XML表现力弱,有太多冗余信息,流量大。
常见案例:Gtalk、新浪微博、Facebook。
②MQTT协议
优点:协议大略,流量少。
缺陷:不是一个专门为IM设计的协议,多利用于推送。
③私有协议
险些所有主流的IM APP都是利用私有协议。
优点:高效,节约流量(一样平常利用二进制协议),安全性高,难以破解。
缺陷:开拓初期没有现有样列可以参考,对付参与IM开拓的程序员的哀求比较高。
常见案例:微信、钉钉。
根据以上的比拟,我们得出结果,一个好的协议须要知足高效、简洁、节约流量、易于拓展等哀求,同时又能够和当前的开拓团队的技能堆栈匹配,不能选择一个他们很难上手的。
这里再提一下,我当时开拓IM系统的时候,上手用的是XMPP,在利用的过程中创造了很多问题,踩了很多坑。
二、IM系统设计(1)系统设计原则①实时性原则
实时到达吸收方,如果用户在线,则实时到达,如果用户不在线,则在用户登录后到达。由于网络颠簸,以及移动端操作系统对运用前后台切换的管理,如何实现用户连接管理、实时推送,推送失落败的处理办法,客户端重连机制,如何补齐等,都须要IM系统考虑。由于TCP开拓略微繁芜,早期的基于HTTP短轮询、长轮询的低效的技能方案,也无法达到实时性的哀求。
②可靠性原则
是指我们常常听到的“投递”,常日用的不丢失和不重复两个技能指标来表示。可靠性是要确保被发送后,能够被吸收者收到。由于网络环境的繁芜性,以及用户在线的不愿定性,的可靠性(不丢失、不重复)是IM系统的核心指标,也是IM系统实现中的难点之一。总体来说,IM系统的“可靠性”,常日便是指谈天投递的可靠性(准确的说,这个“”是广义的,由于还存用户看不见的各种指令和关照,包括但不限于进群退群关照、好友添加关照等,为了方便描述,统称“”)。
从发送者和吸收者用户行为来讲,“可靠性”该当分为以下几种情形:
1、发送失落败:对付这种情形要感知到,明确反馈给发送方。如果此没有发送成功,发送方可以选择重试或者稍后再试。
2、发送成功:如果吸收方处在“在线”状态,该当立即收到此。如果吸收方处在“离线”状态不能收到,一旦上线则急速收到。
3、不能重复:简言之便是发送的一条不能被重复收到多次。
③同等性原则
系统中要重视的时序问题,不能涌现发送的顺序颠倒的问题。常日涌现时序的问题有以下的缘故原由:
1、网络传输延迟导致时序不一致。不同用户发送的到达做事器的延时差异较大,给时序性带来寻衅。早期开拓过程中常常会碰着这种问题。
2、分布式系统的涌现导致时序不一致。IM系统模块浩瀚,接入层、逻辑层等、每层都分布式集群化,这些运用分布在不同的机器上,如何担保时序是个难点。
④扩展性原则
扩展性是IM系统后期要考虑的问题,包括功能的扩展,做事器的扩展等,这次就先不展开阐述。
(2)网络运用框架选型Mina和Netty都是Java领域高性能和高可伸缩性网络运用程序的网络运用框架。
Mina是 Apache 组织的项目,它为开拓高性能和高可用性的网络 运用程序供应的框架。当前的Mina版本支持基于 Java NIO 技能的 TCP/UDP 运用程序开拓、串口通讯程序。目前正在利用 Mina的 软件有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire等。
Netty是由JBOSS供应的一个java开源框架。Netty供应异步的、 事宜驱动的网络运用程序框架和工具,用以快速开拓高性能、高可靠性的网络做事器和客户端程序。也便是说Netty是一个基于NIO的客户端和做事器端框架,利用Netty可以确保你快速和大略的开拓出一个网络运用。
虽然我利用过Mina,但是建议开拓选型上利用Netty。由于Netty有对google protocal buf的支持,有更完全的ioc容器支持(spring,guice,jbossmc和osgi)。Mina更新到2.0就不再更新了,而Netty一贯在更新,目前最新发布的版本已经更新到4.1,从版本更新角度可以看出Netty的社区很生动,修复问题一贯在持续,这将对我们选择它进行开拓带来很多便利。
三、基于Netty架构设计(1)单体系统架构单体Netty IM系统,可以支持10万并发,如果机器性能良好的情形下可以超过10万。
(2)分布式架构分布式的Netty IM系统,可以支持更高的并发数。各组件的功能如下:
①IM Server 连接器:紧张用来卖力坚持和客户真个TCP连接。
②缓存:卖力用户、用户绑定关系、用户群组关系的缓存。 缓存临时数据、加快读速率。可以做成集群办法。
③数据库:用户、群组、离线。可以做成集群办法。
④行列步队:用户状态广播、群组广播。可以做成集群办法。
四、如何快速入手(1)开拓环境开拓环境推举利用netty-4.1.30这个版本,jdk利用1.8及以上版本。如下所示:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.30.Final</version>
</dependency>
(2)组件选择①开拓框架采取Netty + Spring(Spring4.x)。
②Spring采取Spring cloud。基于restful 短连接的分布衰落做事架构,完成用户在线管理、单点登录系统。
③行列步队采取rocketMQ 高速行列步队,整流浸染。
④数据库采取MYSQL。
⑤协议JSON +自定义数据包采取Fastjson。
(3)参考样例基于Netty的IM开源代码在网上有很多,这里就不列举了,可以自行去git高下载。我认为关键是把观点理清楚,技能堆栈选好,总体框架定好,接下来便是开拓一个适宜中小企业的IM系统了,但是要考虑到后期的扩展性,由于一个好的产品不能自己用,要让更多的人利用。