巩鹏军的博客

HOME

IM007 - 兼容性基础 (第一版)

17 Aug 2022

IM是一个持续迭代的系统,很容易同时并存多个版本,而服务端只有一个版本,怎么做好新老版本兼容是一个很重要的话题。

IM 客户端版本分布和IM系统拓扑图

IM是端到端系统,也是以IM Server为中心的星型系统,一个IM系统的客户端不同版本的分布和服务端形成的拓扑图如下:

IM007-IM Client Version Distribution

既然不能让用户从V1强升到V2或者V3,而V3开发耗时数月心里没底儿不敢一下子让用户大规模升上来,怎么办?

只能兼容老版本V1和V2。要做兼容,就先需要判断新老版本,选择一个判断新老版本的标识就是关键。

版本标识

选什么做版本标识呢?

换个视角看选择

再换个角度看选择

再换个角度看选择

最后的抉择

其实版本标识选择更多要考虑人的因素、可持续性维护、多端统一性。

版本通道

短连接:

通过HTTP Header 传递,示例如下:

curl "https://{domain}/api/v1/xxx" \
 -H "platform: ios" \
 -H "version: 8.0.25" \
 -H "traceid: 0ad1348f1403169275002100356696"

长连接:

通过长链接数据包中的header(类似HTTP Header)传递,示例如下:

{
  "platform": "ios",
  "version": "8.0.25",
  "traceid": "0ad1348f1403169275002100356696"
}

短转长:

IM系统有长连接通道,为了优化HTTP,往往会通过短转长方案,来节省TCP建连和TLS握手时间来提高访问速度和请求成功率。

在短转长场景下,短连接已经传了一遍platform和version,长连接SDK也会再传一遍,从业务角度,应该用短链传的,这样业务服务就不用区分请求来自短链还是长链。

参考资料

求指点

关于IM或者长期维护的App的兼容性建设,你有什么好的建议或者方案呢?求指点。可以加我微信gongpengjun或者给我发邮件frank.gongpengjun at gmail.com

关于我

专注于IM即时通讯全技术栈的程序员,关注获取更多IM技术文章。

gongpengjunblog

IM小蓝天

微信扫描二维码,关注我的公众号