即时通讯IM系统开发
我于2014年开启即时通讯的开发之路,历经从服务端到客户端,从第三方到自研,经历过诸多的研发难题,都一一破解。现将经验总结如下,希望对行业内从事IM开发的程序员有所帮助。
①P2P方式
P2P方式多用于局域网内聊天,这种方式在有种种限制和不便。一方面它只适合在线的点对点消息传输,对离线,群组等支持不够。另一方面由于 NAT 的存在,使得不同局域网内机器互联难度大大上升,在某些网络类型(对称NAT)下无法建立连接。使用P2P方式的软件在启动后一般做两件事情:
1、进行UDP广播:发送自己信息和接受同局域网内其他端信息。
2、开启TCP监听:等待其他端进行连接。
②服务器中转方式
大部分的互联网IM产品都采用服务器中转这种方式进行消息传输,相对于P2P的方式,具有有以下的优点:
1、支持更多P2P无法支持或支持不好的业务,如离线消息,群组,聊天室。
2、方便业务逻辑的拓展和新旧版本的兼容,当然它也有自己的问题,就是服务器架构复杂,并发要求高。
通过以上的比较,建议我们在开发IM系统的时候使用服务器中转的方式。
IM的网络连接方式有基于TCP的长连接和基于HTTP短连接两种:
①基于TCP的长连接
基于TCP长连接则能够更好地支持大批量用户,问题是客户端和服务器的实现比较复杂。也有一些改进,比如下行使用MQTT进行服务器通知/消息的下发,上行使用HTTP短连接进行指令和消息的上传。这种方式能够保证下行消息/指令的及时性,但是在弱网络下上行慢的问题还是比较严重,早期的来往就是基于这种方式。
②基于HTTP短连接
常见于WEB IM系统(现在很多WEBIM都是基于WebSocket实现),它的优点是实现简单,方便开发上手,问题是流量大,服务器负载较大,消息及时性无法很好地保证,对大规模的用户量支持不够,适合小型的IM系统。
IM常见的协议有:XMPP,MQTT,私有协议。各种协议优缺点情况如下:
①XMPP协议
优点:协议开源,可拓展性强,在各个端(有各种语言的实现,对于前期入门级的开发者是很好的选择,方便进入IM开发的程序员快速上手。
缺点:XML表现力弱,有太多冗余信息,流量大。
常见案例:Gtalk、新浪微博、Facebook。
②MQTT协议
优点:协议简单,流量少。
缺点:不是一个专门为IM设计的协议,多使用于推送。
③私有协议
几乎所有主流的IM APP都是使用私有协议。
优点:高效,节约流量(一般使用二进制协议),安全性高,难以破解。
缺点:开发初期没有现有样列可以参考,对于参与IM开发的程序员的要求比较高。
常见案例:微信、钉钉。
根据以上的对比,我们得出结果,一个好的协议需要满足高效、简洁、节约流量、易于拓展等要求,同时又能够和当前的开发团队的技术堆栈匹配,不能选择一个他们很难上手的。
这里再提一下,我当时开发IM系统的时候,上手用的是XMPP,在使用的过程中发现了很多问题,踩了很多坑。
①实时性原则
消息实时到达接收方,如果用户在线,则消息实时到达,如果用户不在线,则消息在用户登录后到达。由于网络波动,以及移动端操作系统对应用前后台切换的管理,如何实现用户连接管理、消息实时推送,推送失败的处理方式,客户端重连机制,消息如何补齐等,都需要IM系统考虑。由于TCP开发略微复杂,早期的基于HTTP短轮询、长轮询的低效的技术方案,也无法达到实时性的要求。
②可靠性原则
是指我们经常听到的“消息送达”,通常用消息的不丢失和不重复两个技术指标来表示。可靠性是要确保消息被发送后,能够被接收者收到。由于网络环境的复杂性,以及用户在线的不确定性,消息的可靠性(不丢失、不重复)是IM系统的核心指标,也是IM系统实现中的难点之一。总体来说,IM系统的消息“可靠性”,通常就是指聊天消息投递的可靠性(准确的说,这个“消息”是广义的,因为还存用户看不见的各种指令和通知,包括但不限于进群退群通知、好友添加通知等,为了方便描述,统称“消息”)。
从消息发送者和接收者用户行为来讲,消息“可靠性”应该分为以下几种情况:
1、发送失败:对于这种情况要感知到,明确反馈给发送方。如果此消息没有发送成功,发送方可以选择重试或者稍后再试。
2、发送成功:如果接收方处在“在线”状态,应该立即收到此消息。如果接收方处在“离线”状态不能收到消息,一旦上线则立刻收到消息。
3、消息不能重复:简言之就是发送的一条消息不能被重复收到多次。
③一致性原则
系统中要重视消息的时序问题,不能出现发送的消息顺序颠倒的问题。通常出现时序的问题有以下的原因:
1、网络传输延迟导致时序不一致。不同用户发送的消息到达服务器的延时差异较大,给消息时序性带来挑战。早期开发过程中经常会遇到这种问题。
2、分布式系统的出现导致时序不一致。IM系统模块众多,接入层、消息逻辑层等、每层都分布式集群化,这些应用分布在不同的机器上,如何保证时序是个难点。
④扩展性原则
扩展性是IM系统后期要考虑的问题,包括功能的扩展,服务器的扩展等,这次就先不展开阐述。
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更新到20就不再更新了,而Netty一直在更新,目前最新发布的版本已经更新到41,从版本更新角度可以看出Netty的社区很活跃,修复问题一直在持续,这将对我们选择它进行开发带来很多便利。
单体Netty IM系统,可以支持10万并发,如果机器性能良好的情况下可以超过10万。
分布式的Netty IM系统,可以支持更高的并发数。各组件的功能如下:
①IM Server 连接器:主要用来负责维持和客户端的TCP连接。
②缓存:负责用户、用户绑定关系、用户群组关系的缓存。 缓存临时数据、加快读速度。可以做成集群方式。
③数据库:用户、群组、离线消息。可以做成集群方式。
④消息队列:用户状态广播、群组消息广播。可以做成集群方式。
开发环境推荐使用netty-4130这个版本,jdk使用18及以上版本。如下所示:
ionetty
netty-all
4130Final
①开发框架采用Netty + Spring(Spring4x)。
②Spring采用Spring cloud。基于restful 短连接的分布式微服务架构,完成用户在线管理、单点登录系统。
③消息队列采用rocketMQ 高速队列,整流作用。
④数据库采用MYSQL。
⑤协议JSON +自定义数据包采用Fastjson。
基于Netty的IM开源代码在网上有很多,这里就不列举了,可以自行去git上下载。我认为关键是把概念理清楚,技术堆栈选好,总体框架定好,接下来就是开发一个适合中小企业的IM系统了,但是要考虑到后期的扩展性,因为一个好的产品不能自己用,要让更多的人使用。
一个在线客服系统在技术上应该有一下几个基本的方向:
通信协议(http、websocket等)
集群部署(没有集群怕是服务的客户量会很少而且升级一会很麻烦)
大数据相关技术(在线客服记录的基础数据有访客的浏览数据、对话数据、客户信息等等数据量是比较大的,了解大数据相关的数据应该是必备的)
智能学习-机器学习(一个好的在线客服系统应该需要提供智能客服帮助人工客户解决问题)
可以通过专业的在线客服对外提供的API了解到很多他们用的技术栈和开发思路。比如:一洽客服开放API
winform 开发 主流框架依然是N层架构,随着时间的推移,从面向对象集成系统开发转向面向服务的分布式开发,C# aspnet 当前主流架构依然是MVC 类似于C#的N层架构框架 当前是MVC5。
相关框架如下:
1、JsonNET
是一个读写Json效率比较高的Net框架JsonNet 使得在Net环境下使用Json更加简单。通过Linq To JSON可以快速的读写Json,通过JsonSerializer可以序列化你的Net对象。让你轻松实现Net中所有类型(对象,基本数据类型 等)和Json的转换。
2、MathNET
目标是为提供一款自身包含清晰框架的符号运算和数学运算/科学运算,它是C#开发的开源类库。MathNET含了一个支持线性代数的解析器,分析复杂微分,解方程等等功能。
3、FakerNet
开发的时候是不是为测试数据烦恼?FakerNet可以非常方便帮你生成大批量测试数据。例如人员表里面的姓名、性别什么的。
4、Html Agility Pack
是CodePlex 上的一个开源项目。它提供了标准的DOM API 和XPath 导航--即使 HTML 不是适当的格式!HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦。
5、NCrawler
是一款国外的开源网络爬虫软件,遵循LGPL许可协议。其HTML处理使用的是htmlagilitypack开源库,采用xpath的方式处理定位网页元素,十分方便。
6、SuperWebSocket
基于NET开源Socket框架SuperSocket开发的, SuperSocket所支持的大部分功能在SuperWebSocket中得到了继承。用户可通过SuperWebSocket来快速的构建可靠的,高性能的websocket服务器端应用程序。
7、SuperSocket
一个轻量级的可扩展的 Socket 开发框架,可用来构建一个服务器端 Socket 程序,而无需了解如何使用 Socket,如何维护Socket连接,Socket是如何工作的。该项目使用纯 C# 开发,易于扩展和集成到已有的项目。只要你的已有系统是使用NET开发的,你都能够使用 SuperSocket来轻易的开发出你需要的Socket应用程序来集成到你的现有系统之中。
8、QuartzNET
一个开源的作业调度框架,是 OpenSymphony 的 Quartz API的NET移植,它用C#写成,可用于winform和aspnet应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而 创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。
9、LuceneNet
Lucene的net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。开发人员可以基于Lucenenet实现全文检索的功能。
10、HttpLib
一个基于C#语言的http协议的类库,Httplib让异步交互处理数据更容易了。类库的方法包括:上传文件到服务器,获取页面数据等等。
11、Smart Thread Pool
智能线程池,用SmartThreadPool可以简单就实现支持多线程的程序,由线程池来管理线程,可以减少死锁的出现。SmartThreadPool还支持简单的生产者-消费者模式,当不需要对任务进行持久化时,还是很好用的。
12、DocX
是一个用来操作word的轻量级的类库。借助DocX,开发人员可以在不需要安装Microsoft Word的情况下操纵word2007/2010文件。
13、NPOI
是 POI 项目的 NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。
14、PDFsharp
可以轻松地在 NET 语言中创建PDF文档的开放源码库。它使用相同的绘制程序来创建 PDF 文档,在屏幕上显示,以及输出到打印机。可以修改、合并、拆分已经存在的 PDF 文件,支持透明图像。
15、Dapper
一个轻型的ORM类。代码就一个 SqlMappercs文件,编译后就40K的一个很小的DllDapper很快。Dapper的速度接近与IDataReader,取列表的数据超 过了DataTable。Dapper支持Mysql,SqlLite,Mssql2000,Mssql2005,Oracle等一系列的数据库,当然如 果你知道原理也可以让它支持Mongo db。话说,这个ORM,博主自己也一直在使用,确实十分强悍,至少在性能方面,恐怕NET里面的大多数ORM只能是望其项背了。
16、NHibernate
现在开发人员用的较多的一个ORM。NHibernate是一个面向NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。
17、log4net
Apache log4j框架在Microsoft NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。
18、SharpSerializer
一个开源XML和二进制序列化器。SharpSerializer可以序列化Xml和自己的二进制格式,还可以序列化Json等其他文本格式或其他数据加密,压缩,优化等二进制流。
19、XProxy
一个支持插件的基础代理程序集。通过编写简单的插件程序,你将能开发各种各样的代理程序。
XProxy是一个支持插件开发的数据交换机,可以编写插件对中转数据进行处理。内置有NAT插件、加解密插件、反向代理、直接代理、间接代理等插件。
20、nopCommerce
国外的一个高质量的开源b2c 网站系统,基于EntityFramework40和MVC30,使用Razor模板引擎,有很强的插件机制,包括支付配送功能都是通过插件来实现 的,基于xml的多语言版本,非常灵活的语言切换功能,包括在后台都能同时编辑产品的中英文属性,非常适合做外贸,优秀超前的程序架构,性能也非常强大, 自定义的产品名称和分类又有很好的seo优化。综合能力远远高于国内的一些程序架构糟糕的net商城程序,是二次开发和大型b2c架构的首选。30开 始支持多店。
21、Enterprise Library
目前最新版本为v50,支持NET Framework 40,共包括9个Application Block,包括数据访问(Data Access Application Block)、异常管理(Exception Handling Application Block)、数据验证(Validation Application Block)等等,对企业应用开发非常有帮助,也非常实用。
22、Autofac
一款非常优秀的IOC框架,比较于其他的IOC框架,如SpringNET,等等之类的,它非常的轻量级且性能上也很卓越。
23、AutoMapper
一个NET的对象映射工具。主要用于领域对象与DTO之间的转换、数据库查询结果映射至实体对象。
24、7-Zip
一款号称有着现今最高压缩比的压缩软件,它不仅支持独有的 7z 文件格式,而且还支持各种其它压缩文件格式,其中包括 ZIP, RAR, CAB, GZIP, BZIP2和 TAR 等等。此软件压缩的压缩比要比普通 ZIP 文件高 30-50% ,因此,它可以把 Zip 格式的文件再压缩 2-10% 。
0条评论