打造流畅聊天稳定体验:三种方法实现的即时通讯功能
新一代IM及时通讯海王IM即时通讯技术的发展即时通讯Instant Messaging是一种基于互联网的即时交流消息的业务。实时聊天交互功能是市面上主流APP的重要功能之一人们所熟悉的就是微信QQ的聊天消息系统IM看似简单技术开发绝非易事海量并发超低延时消息必达等高实时性需求需要众多技术的应用合体近几年随着移动互联网的深入渗透和社交的迅速发展IM衍生出了很多新的玩法不仅仅应用于社交聊天场景还出现在电商、直播、客服等各种场景正在被人们广泛的应用。调研数据显示市面上60%以上的APP拥有即时通讯能力用户可以直接在app内跟其他用户实时聊天有助于提升app活跃和用户体验。IM功能的实现已成为应用开发者们必修课程。笔者从事IM开发工作十年有余本文主要分享IM开发的3种实现方式希望对IM开发者有所帮助。IM即时通讯3种实现方式IM开发的3种实现方式分别为1、开源代码 2、自研 3、集成IM SDK。开发者可根据项目情况进行选择。一个IM产品的落地大体上可以分成三个重要部分客户端开发服务端开发服务运维。客户端开发包括各平台的手机app、桌面软件网页端小程序端等。服务端开发负责IM各种功能的实现比如用户接入、关系链维护、收发消息、文件图片存储、安全审核等。服务运维一个长期运营的产品必定需要一个持续性的运维过程以保证IM服务端稳定可靠比如业务量上涨的扩容处理。 以上三部分任何一部分从零到一的实现都会有不小的难度完全自研对项目成员能力以及资源投入的要求都比较高。除了大型公司会完全自研以外一般都会采取引用开源代码或者集成商业IM SDK的方式。下面总结一下这3种实现方式的区别。表IM3种实现方式\实现方式 对比维度 开源代码 自研 集成商业IM SDK实现难度 低 高 中功能扩展性 依赖开源项目计划相对困难 不依赖外部条件相对简单 依赖其它厂商难度中等运维成本 自己运维成本高 自己运维成本高 不需要自己运维上线周期 中 慢 快适用人群 个人体验 研发能力较强的大公司 中小型公司个人工作室第一种实现方式使用开源项目实现IM聊天实现IM功能最快的方式就是选择开源项目不仅是站在巨人的肩膀上还可汇集全社区的智慧进行快速开发如何选择IM的开源项目项目功能的完善度和活跃度是主要参考的维度根据过往经验我选取了两个还算不错的开源项目供大家参考。MobileIMSDK是一个原创移动端IM通信层框架轻量级、高度提炼历经8年、久经考验。是市面上唯一同时支持UDPTCPWebSocket三种协议的同类开源框架支持iOS、Android、Java、H5服务端基于Netty。PS:需要注意的是该项目的H5端暂未开源小程序与Uniapp也还在开发之中。OpenIM的创始团队来自IM高级架构师 由IM/WebRTC专家团队开发致力于用开源技术创造服务价值打造轻量级、高可用的IM架构方便开发者构建多种即时通讯及实时音视频互动场景。借鉴开源项目适合开发周期紧无需太多定制化开发者可帮助开发者快速实现IM功能。但功能一般相对简单基础且后续的功能扩展严重依赖开源项目的开发进度。如果对定制化功能需求比较高或者未来业务体量比较大建议不要偷懒去使用这种方式。对IM定制化要求高有研发能力的团队一般采取自研的方式接下来会跟大家分享下自研过程中的技术难点和坑点。第二种实现方式自研实现IM聊天IM技术涉及范围很广完全自研对研发团队能力、资金投入要求都比较高研发周期也会拉的比较长。为了防止错失商机需要做好长期的规划。如图自研技术概览我们在自研IM过程中也遇到了一些比较棘手的技术难题这里列出来给大家做个参考比如消息的可靠性、有序性。高并发场景下的消息实时推送以及消息拉取。消息存储方案选型使用读扩散还是写扩散。消息未读数的准确计算。群回执消息。异地多活。对这些问题感兴趣也可以参考优秀IM学习网站即时通讯网http://www.52im.net/。自研过程中有些功能也可以直接使用市面上的成熟产品比如文件存储安全审核消息离线推送。以加快研发步伐。未来如果决定自研这部分功能也可以很方便的替换掉达到事半功倍的效果。对于有经济和开发实力的企业且业务预期客户体量大建议走自研的实现方式符合后期能力拓展、快速迭代和稳定运维的规划。但自研需要投入较大的人力、财力建议想要走自研的开发者做好明确的开发规划减少不必要的损耗。引入开源项目无法很好的扩展新功能且运维复杂难以支撑未来的长期发展自研路线周期长成本较高。那有没有折中一点的方案呢既可以快速上线又不用投入那么大的成本还可以定制化需求。集成商业sdk则是最便捷的方式这也是目前较主流的开发模式。现在sdk厂商都很成熟很多公司会选择此方式。第三种实现方式集成商业IM SDK实现IM即时通讯集成商业sdk具有以下优势快速落地IM产品快速上线抢占市场。服务稳定避免烦杂的运维工作。功能可扩展增加新功能时可以主动向sdk厂商提需求实现。相比自研大幅降低成本。 ##IM即时通讯产品落地流程选择集成商业sdk时产品落地流程如下申请sdk厂商服务账号获取账号秘钥用于用户登录。开发业务服务后台用于计算登录鉴权信息。集成厂商sdk开发应用程序比如iOS应用、Android应用、小程序等。 以收发消息为例各模块之间的交互流程如下由此可见集成商业sdk的方案只需要开发一个简单的业务后台然后集成sdk开发自己的应用程序即可快速上线服务。IM SDK 厂商推荐-即构 IM SDK当前市面上已经有不少成熟的IM SDK厂商在这里推荐一家不错的厂商–即构科技。之前开发的直播产品接了即构的RTC SDK整个接入过程很顺畅近期因项目需实现即时通讯功能同一厂商图方便抱着尝试态度接入ZEGO IM SDK没想到很快就完成开发实现了。ZIM支持所有主流平台包括flutter和uniapp两大跨平台框架加速产品上线。在消息安全审核方面他们采用主流第三方安全厂商的服务需要的审核功能基本都能够支持。实时通信的项目随着业务不断发展对通信服务的高可用/高并发/低延时有更高的要求。之前使用他们的RTC产品低延迟业内领先表现很优秀。IM产品我拿集成的Demo测试了下端到端延只有几十毫秒。即构的IM产品不仅支持基础的单聊/群聊功能还支持消息高并发量的房间聊天官网数据显示单房间人数支持到百万以上适合对房间人数要求高的场景使用。另外还有很新颖的呼叫邀请功能满足即时通讯的需求。经验分享基于即构ZIM实现即时通讯功能应项目需求笔者选用ZIM实现单聊场景消息收发仅有简单2步整个过程半天搞定。以下以本人的经验分享如何快速实现单聊场景消息收发。集成sdk过程感兴趣的小伙伴到**海王IM**官网查看在此不赘述。IM 的使用场景中比较常见的是点对点消息这里我们以安卓端收发文本消息为例。3步轻松实现即时通讯消息收发1、初始化 IM SDK获得一个 ZIM 实例zim ZIM.create(appID, application);Lobster AI12、登录ZIM类比微信账号登录的操作用来作为收发消息的载体void login(ZIMUserInfo userInfo,String token,ZIMLoggedInCallback callback)Lobster AI1对应 UI 示例3、发送端调用发送单聊文本消息登录后便可调用该接口在 message 填上想要发送的消息在 toUserID 填上接收端的 userID想要发送时调用即可接口展示void sendPeerMessage(ZIMMessage message,String toUserID,ZIMMessageSendConfigconfig,ZIMMessageSentCallback callback)Lobster AI1对应 UI 示例4、IM接收端收消息(1) 通过 setEventHandler 注册事件回调的接收对象IM 运行过程中会有各式各样的事件产生收到了一条消息、网络连接中断等通过该接口便可以接收 ZIM 抛出的事件以便 App 做出相应的反应。void setEventHandler(ZIMEventHandler handler)Lobster AI1(2) 在注册事件回调的接收对象中重写接收单聊消息的方法zim.setEventHandler(new ZIMEventHandler() {Overridepublic void onReceivePeerMessage(ZIM zim, ArrayList messageList, String fromUserID) {}});Lobster AI123456对应 UI 示例由此我们实现了点对点文本消息的收发。By the way ZIM SDK 也支持富媒体消息的收发包括图片、视频、音频和文件。发送富媒体消息时只需要将文件的 path 传入接口上传进度可从 progress 回调中获得。————————————————