IM开发干货分享:IM客户端不同版本兼容运行的技术思路和实践总结
source link: http://www.52im.net/thread-4202-1-1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
本文由巩鹏军分享,原题“IM兼容性基建”,即时通讯网有修订。 一个成熟的IM成品,在运营过程中随着时间的推移,会发布不同的版本,但为了用户体验并不能强制要求用户必须升级到最新版本,而服务端此时已经是最新版本了,所以为了让这些不同客户端版本的用户都能正常使用(尤其IM这种产品,不同版本可能通信协议都会有变动,这就更要命了),则必须要针对不同客户端版本的兼容处理。本文将基于笔者的IM产品开发和运营实践,为你分享如何实现不同APP客户端版本与服务端通信的兼容性处理方案。 2、关于作者
3、一个App时怎么办?提示:“一个App”指的是同一个IM服务端,只服务于一个特定的IM产品。 首先想到的就是直接使用App版本号判断新老版本并进行兼容处理。如下图所示:
4、多个App时怎么办?4.1概述提示:“多个App”指的是同一个IM服务端,可能作为通用服务,作为多个不同APP产品中的聊天模块使用的场景。 只有一个App时肯定是比较简单的。但现实情况是一套IM系统通常会用于多个业务场景,这是很普遍的现象。业界的知名IM产品,比如钉钉、飞书、企业微信、美团大象等都是这样。底层逻辑大概是:IM系统比较复杂,功能繁多而且难以实现、更难以稳定,所以一个IM团队维护一套IM系统,然后应用在多个业务场景就是最具性价比的选择了。 4.2使用App版本号每个业务场景都会有自己的客户端App,每个App都有自己的版本号,那么根据App版本号判断新老版本的逻辑就不适用了(如下图所示)。
4.3使用App版本号的麻烦随着App的增多,需要的判断也越多,这会很麻烦,也很容易出错。每个App推出新版本后,用户不可能瞬间就升级到最新版本,根据经验,每个App往往都会同时存在十个以上的不同版本。 这就会形成如下图所示的局面: 5、多个App时,可将IM能力提炼为一套公用代码多个App时的问题总结起来就是:一套服务端代码如何适应集成了不同IM能力的不同App客户端?我们来具体举例分析一下,假设一个IM团队维护的IM相关的客户端模块有IM Client SDK、联系人、长连接、朋友圈等四个模块(如下图所示)。
比如下面这样:
6、给每个App中使用的公用代码(Core)一个版本号如上节所述,我们将IM能力提炼为一套公用代码(以下内容简称“Core”)。那么,我们能不能给Core一个版本标识呢? 答案是肯定的:
7、如何正确地解读Core版呢?7.1抛开App看Core版本如果不看App版本,只看Core版本标签:7.2从一套服务端代码看Core版本同一个IM团队,其IM Servers必然也是同一套代码集,不考虑部署的区别。那么上图逻辑上等价于下图: 7.3使用Core版本的兼容性判断站在Core的视角,多个App就像单个App类似,只是使用的版本标识不同。具体如下:
一个App时:
8、关于Core版本的命名和取值关于Core版本号的取值,有下列可能的选项:
用自然数 1、 2、 3作为Core版本号是可以的,每个迭代发布新的Core版本时递增一下就可以了。 但是考虑到有多个终端平台iOS、Android、Windows、Mac,如果某个平台的Core发布后发现小Bug需要HotFix,那么要递增版本号,就会挤占其它端的下一个自然数。究其原因,在于自然数是连续的,没办法在两个常规的版本间插入一个HotFix版本。
9、多个App情况下的其它版本标识1)platform:一套Core,不同端在实际开发中,可能存在差异,为了针对具体端进行特定的兼容,需要知道当前是哪个端,可以约定platform字段表示端。取值可以是:ios、android、win、mac、linux等。 2)App版本号: 在IM相关逻辑的兼容性判断中,只需使用跨App的多端一致的core_level了。但是为了和最终用户、产品经理等沟通方便,保留App版本号app_version用于人和人之间沟通交流。core_level主要用于研发工程师之间,还有工程师和程序之间的沟通。两者各取所长。 10、版本标识的传输方式每个API和每条长连接数据包都携带Core版本,这样服务端可以无状态得处理每一个请求。如果需要在服务端主动推送时区分目标端的版本,可以在App登录时将其携带的Core版本落库存储,然后推送时查询使用。10.1短连接(HTTP)HTTP短连接通过新增Header字段方式传输:
10.2长连接(Socket)长连接SDK通过类似HTTP Header的方式传输:
10.3短转长短转长时HTTP Header会转换为长连接数据body里的header通过长链传递。这样就同时存在长连接header和长连接body.header两套字段,最终以长连接body.header为准即可。 10.4其它IM系统里的浏览器和小程序,如果可以新增HTTP Header则新增Header传输,实在没有办法可以通过User-Agent传输该信息,服务端优先解析Header,没有找到时再解析User-Agent。服务端解析UA的正则表达式:
11、本文小结至此,我们找到了一个适用于多个App、多个子模块、多个功能点、临时BugFix的版本标识:Core版本号,这样就可以很好地解决多App的IM能力兼容性问题。以下是版本兼容性判断伪码:
12、参考资料[1] Browser vs Engine Version[2] Node.js ABI version number [3] Android SDK API Level [4] 零基础IM开发入门(一):什么是IM系统? [5] 一套海量在线用户的移动端IM架构设计实践分享(含详细图文) [6] 一套原创分布式即时通讯(IM)系统理论架构方案 [7] 从零到卓越:京东客服即时通讯系统的技术架构演进历程 [8] 一套亿级用户的IM架构技术干货(上篇):整体架构、服务拆分等 [9] 基于实践:一套百万消息量小规模IM系统技术要点总结 [10] 一套十万级TPS的IM综合消息系统的架构实践与思考 [11] 从新手到专家:如何设计一套亿级消息量的分布式IM系统 [12] 闲鱼亿级IM消息系统的架构演进之路 [13] 深度解密钉钉即时消息服务DTIM的技术设计 [14] 一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践 [15] 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等 | ||||||||||||||||||||
来源:即时通讯网 - 即时通讯开发者社区! |
本帖已收录至以下技术专辑
- IM综合资料|主题 88·关注 0
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK