一些关于IM客户端架构的总结

前言

我目前负责一个办公类App开发,为用户提供在线聊天,音视频通话,文件传输,以及办公小程序容器等功能,同时还提供PC、Pad、Phone三个平台设备客户端。RD们需要提供的能力有:IM基础通讯,IM消息端对端加密,OSS文件存储与上传下载管理,用户权限控制等等功能。

从功能复杂度上看,这将是一个大型的开发项目,所以架构设计将对项目的迭代非常重要,不论是业务功能的可维护性还是在模块的低耦合都是架构设计需要考虑的。

架构大纲

kCO5Dk-202102071042211612665741

主业务模块

主业务模块,从名字上可以看出是一个偏向业务定制的模块。

这个模块中页面或者功能在设计时更多考虑的是业务快速实现。例如:注册登录界面,用户详情展示页,第三方库的封装配置,通用模块的注册与配置。

当某个功能经过迭代成长,具有一定的通用业务能力时,会从主业务模块中拆分出来,封装成单独模块供其他业务使用。例如:用户的权限管理,网络时钟工具,HTTP连接管理模块。

IM模块

作为一个办公类IM App,IM模块是最重要的一个模块。这个模块从功能上,分为通讯数据管理与UI展示两个部分。

UI展示的功能有:聊天会话列表,聊天会话的定制化(输入控制面板,气泡样式定制等),音视频通话界面等。

通讯数据管理的功能有:IM的连接状态管理,IM的消息收发管理,信令管理,数据库管理等。

OSS与文件管理模块

源于IM模块,为IM提供文件传输的功能。由于OSS上传下载以及本地文件管理有着很强的通用性,于是对这个模块进行了单独分装。

这个模块提供本地文件存储,下载进度管理,断点续传,分片上传等OSS功能。

端对端加密能力模块

通过DH、AES、RSA等加密算法,提供两个设备端之间可以通过公私钥交换搭建安全信道的协议。同时需要实现证书结构,与后台CA共同维护设备证书。

这模块属于专业功能,封装了整套端对端加密的算法实现。

身份与权限模块

源于主业务模块,维护用户的鉴权信息,如token有效性,用户的基础信息等。同时也维护服务端下发的用户权限配置,实现客户端用户权限管理。

App业务配置模块

管理通用模块的注册逻辑,提供优先级管理,自动注册等功能。

搜索模块

负责如首页搜索,全局或局部的数据搜索业务。

注册和管理不同模块的搜索能力,方便在不同的模块中使用搜索功能。

需要注意的是搜索API需要异步实现,并且当出现高并发时需要取消失效的搜索任务,只匹配最新的搜索条件。比如用户开始搜索,在第一次搜索结果未返回时,用户又连续搜索了4次,如果不做处理,则会生成5个搜索结果,而其中的2,3,4其实是无效的搜索条件,当第1次搜索结束后,可以直接进行第5次搜索的匹配。

Hybrid容器模块

为H5提供Native的能力支持,发展小程序业务,利用H5迭代更快,实时接入的优点来为App赋能。

提供Native与JS的通信能力,提供与JS异步/同步通信的API,对Native函数与JS函数实现注册管理。

基础能力模块

日志管理模块

​ 提供日志文件管理、上传管理、日志等级管理等功能。

基础功能模块

​ 提供工具类,系统类方法扩展等。

网络模块

​ HTTP网络管理,请求/响应插件管理。

​ TCP网络管理,粘包/解包处理。

埋点模块

​ 根据业务配置表来管理客户端的埋点,管理数据上报逻辑,也负责预处理上报数据。

路由模块

​ 提供配置注册功能,可由服务端下发路由配置。

​ 提供App外部(如通知、网页)通过URL跳转App页面能力。

​ 提供App内部通过URL跳转页面,或者执行预设函数的能力,解耦模块。