即时通讯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系统了 , 但是要考虑到后期的扩展性 , 因为一个好的产品不能自己用 , 要让更多的人使用 。


【即时通讯IM系统开发】


推荐阅读