范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

即时通讯IM系统开发

  我于2014年开启即时通讯的开发之路,历经从服务端到客户端,从第三方到自研,经历过诸多的研发难题,都一一破解。现将经验总结如下,希望对行业内从事IM开发的程序员有所帮助。一、基础技术选型(1)通讯方式
  ①P2P方式
  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及以上版本。如下所示:
  io.netty
  netty-all
  4.1.30.Final
  (2)组件选择
  ①开发框架采用Netty + Spring(Spring4.x)。
  ②Spring采用Spring cloud。基于restful 短连接的分布式微服务架构,完成用户在线管理、单点登录系统。
  ③消息队列采用rocketMQ 高速队列,整流作用。
  ④数据库采用MYSQL。
  ⑤协议JSON +自定义数据包采用Fastjson。(3)参考样例
  基于Netty的IM开源代码在网上有很多,这里就不列举了,可以自行去git上下载。我认为关键是把概念理清楚,技术堆栈选好,总体框架定好,接下来就是开发一个适合中小企业的IM系统了,但是要考虑到后期的扩展性,因为一个好的产品不能自己用,要让更多的人使用。

宝华韦健PX无线降噪耳机,颜值和音质比BampampampO索尼BOSE更好汽车界有声名显赫的3B宾利(Bentley)奔驰(Benz)和宝马(BMW),音响界同样也有响誉世界的3B宝华韦健BowersWilkins(BW)BangOlufsen(BO)博SNH48到天津OPPO线下店当一日店长了,同款耳机太亮眼国内最大型的青春女子团体组合SNH48,相信很多人都不会陌生,此前OPPOEnco系列赞助的公演现场也令很多网友印象深刻。而继25日合作后,目前SNH48与OPPO的跨界合作又有了旗舰手机和普通手机只有配置区别?小米高端旗舰的制造告诉你答案近年来,小米在高端市场的发展可谓是肉眼可见,在小米10系列宣布进军高端后,随着小米11系列小米MIXFOLD等机型的推出,小米高端旗舰受到更广泛的认可。但是大家知道吗?小米的高端旗白菜价的多彩兔子硅胶灯,用来逗孩子OR当啪啪氛围灯都不错孩子晚上上厕所要起床帮开灯很麻烦,怎么办呢?考虑过声控WIFI的,可卫生间里没有多于的插座,放弃。只能买带电池的小夜灯,正好这个时候白菜君推送了一条信息。光看样子就很可爱,而且相似独家音质提升技术K2加持,JVC杰伟世SD70BT头戴式蓝牙耳机一前言虽然HIFI烧友对于蓝牙耳机不屑一顾,但对于一般的音乐爱好者来说,手机蓝牙耳机所带来的舒爽感觉远比传统HIFI听音方式来得畅快得多。在关注这类产品的时候,发现了几款比较感兴趣MEIZU魅族15Plus手机的这几点你知道吗一颇为无奈的选择到6月份就满两年使用期的努比亚Z11MAX又被狠狠摔了一下,一直裸奔的手机再遭重创摄像头连扫码都完成不了了。先前定下的两年之期终是没能完成,有着一丝不舍一丝解脱。别和网易严选打擂台,淘宝自有品牌淘宝心选儿童浴巾测试前段时间家里买了两条金号的浴巾准备给小孩用,收到货后发现很硬,不适合小宝宝用。正好值得买众测上的淘宝心选系列就有儿童浴巾,有幸抽中了。现在,就带大家看看淘宝心选的6层儿童纱布浴巾有清仓还是翻新?不到半价的旗舰手机,魅族Pro7Plus详细体验一多少才是好价从魅蓝Metal到魅族Pro7魅蓝Note6,再到今年的魅族15PlusPro7Plus,魅族是我用过最多手机的品牌。对于魅族,我算不上粉丝,但由于Flyme的缘故一2017年玩机报告高性价比入门机最尴尬旗舰机,最丑全面屏作为一个数码粉,我对于手机的关注远高于一般人。当然了,作为一个穷人,隔三差五换机是不可能的。心痒难耐怎么办?久而久之我就形成了看翻摸三大习惯各大手机品牌的发布会是要看看的ZDM上的阿思翠Lyraclassic平头耳塞有情怀更有好声音,大声场多玩法平头耳塞如今的状况,用美人迟暮来形容也不为过。在售的平头耳塞大多是几十元到一百多元的低端产品,很多平头耳塞爱好者只能无奈转投入耳。让人欣慰的是,还是有一些厂商在努力探索平头耳塞的发趣味外观与互动设计,KKC儿童电动牙刷让宝贝爱上刷牙电动牙刷和传统牙刷相比有两个优点清洁力更好,不易损伤牙齿。近几年随着国产电动牙刷迅猛发展,电动牙刷价格已经很平民化,越来越多的家庭开始使用电动牙刷。在我家,就有几支电动牙刷。市面上
华为Watch3败了所有好感用了这么多年华为的东西,直到入手Watch3后,终于还是忍不住想问一句靠爱国情怀而忽略产品本身的营销策略,能走多远?6月11日,Watch3上市的第一天迫不及待在家附近的华为专卖店既然木星全身都是氢气,那么如果有流星撞击会爆炸吗,爆炸后燃烧会和太阳一样吗?恒星要了解木星到底是不是可以被点燃成恒星这个问题,实际上,我们要想知道的是恒星是如何炼成的?这里要想强调一下,真的不是一把火点了着的。我们要知道的,要点着氢的前提是有氧气。而宇宙几英特尔将在11月19日发布第12代酷睿系列处理器,及配套的Z690芯片组随着英特尔即将发布第12代酷睿系列处理器,最近两天相继传出了美国和欧洲地区零售商的定价,似乎已在做发售准备了。此前有消息指出,英特尔计划于2021年10月或11月(大概在10月25RedmiBuds3发布半入耳设计高通芯片众筹价159元大泽科技SHOW今日,Redmi正式推出一款TWS耳机新品RedmiBuds3。作为全新产品系列Buds的首款产品,RedmiBuds3主打轻巧半入耳设计,拥有近乎无感的舒适佩戴体vivo自研芯片V1今天亮相X70系列首发vivo将于9月9日发布vivoX70系列新品,包括vivoX70vivoX70Pro和vivoX70Pro三款。作为X系列新成员,vivoX70系列和上一代最大的不同之处在于前者如果耳机能当充电宝,那会是什么体验?南卡N2s就做到了你的包里面都有什么?如果你是通勤一族,估计除了手机和耳机,大概率还会备一个充电宝吧?现在包里的东西越来越多,我们的原则是能精简就精简,如果要是把耳机和充电宝合二为一,是不是又可以为主流装机选啥板?看完这篇不犯难AMD锐龙5000系列和Intel第11代酷睿都是当前装机最新最流行的处理器选择,不过要充分发挥出这些新款处理器的性能同时还要满足日常应用的功能需求,那在选择主板的时候就需要讲究一为什么电视那么大才23千元,手机那么小要56千元?谢邀!虽然电视屏幕比手机大很多,但两者的科技含量完全不一样,价格自然也大不相同。首先,电视的体积虽然很大,但如果你有机会把电视拆开来,会发现它的主板其实也很小,可能还没有电脑的主板你的手机里都有哪些APP?有什么好的分享?大学开学时间越来越近啦今天特意为学生党整理了大学生开学必备APP合集,让你先人一步熟悉大学校园生活!学习必备哔哩哔哩是的,你没看错!B站不仅是追番的快乐源泉,还是学习的宝藏APP。小米汽车刚官宣商标却被驳回,汽车商标成抢注重灾区9月1日,小米创始人雷军发布微博称,小米汽车新同学,今天开学了!据了解,小米汽车正式完成工商注册,注册资金100亿元人民币,由雷军担任法人代表,正式落户北京,并已搭建近300人的团助听器的耳模有什么作用?耳模(earmold)是一个声学插件,作bai为一个完整的助du听系统的一部分zhi,它将助听器放大后的声音从助听器的接dao受器(receiver)传递到外耳道或鼓膜处。对于耳内