云信IM SDK接口设计实践

IM (Instant Messaging) 是网络上最流行的通信方式,与日常生活息息相关。 IM 软件也层出不穷,例如:微信、 QQ 、易信等。通过多年深耕和技术沉淀,云信产出了一套成熟稳定的 IM SDK 架构。它提供了 IM 的主要功能,大大降低了第三方实现 IM 功能的难度。本文主要对 IM 接口设计实践展开论述。

作者:陈吉力 网易智慧企业高级 Android 开发工程师

一、对外接口的设计准则

SDK 对外提供接口设计的基本原则是易用,易懂,易扩展,易监控。展开来可归纳为以下几个特性:

1. API 按照业务功能分类,但所有业务具有统一的调用风格。

2. API 不包含方法实现,接口的实现对调用者隐藏。

3. API 调用可跟踪。

在功能形式上, SDK 需要提供以下类型的 API :

1. 功能接口:主动调用使用其提供的功能

1.1. 同步接口:在调用线程完成函数调用,并立即返回结果。

1.2. 普通异步接口:在后台线程完成函数调用,可以添加回调函数。

1.3. 可中断异步接口:在后台线程完成函数调用,可以添加回调函数,可以中断调用。

2. 回调接口:监听数据和状态改变。

二、业务的分类

SDK 包含多种业务,一部分是基础业务,另一部分是可选业务。比如用户认证服务、群服务等是基础业务;超大群服务、第三方推送服务等是可选业务。

另外,不同的业务之间难免有相似的功能,如群服务和超大群服务中,都有添加群成员,拉取群消息等功能。因此,需要将不同的业务进行隔离,一方面方便业务功能的扩展与调整,另一方面方便函数的命名与用户的理解。

同一个业务下有多个 API ,按照调用的主动性,分为回调接口和功能接口,分别放在与业务一一对应的接口类 Observer 和 Service 中。

例如:用户认证服务下的所有回调接口和功能接口都位于 AuthServiceObserver 和 AuthService 中。其中由用户主动调用来实现功能的功能接口在 AuthService 中,如登录、登出等;而用于注册回调的回调接口都在 AuthServiceObserver 中,如监听在线状态、监听数据同步等。

每个 Service 中的功能接口根据执行的性质又分为三种,同步接口、普通异步接口和可中断异步接口。

其中同步接口在调用线程立即执行;异步接口在后台线程执行,在调用线程返回可设置回调的 InvocationFuture 类型,最终结果在主线程回调;可中断异步接口和普通异步接口相似,但是返回的是继承自 InvocationFuture 的 AbortableFuture 类型,支持中断操作,用户可以通过主动调用来中断功能接口的执行。

接口调用的线程切换流程如图 2.1 所示,业务功能和接口的分类如图 2.2 所示。

云信IM SDK接口设计实践

Figure 1接口调用的线程切换流程

云信IM SDK接口设计实践

Figure 2业务功能和接口的分类

三、API的实现

(一) API的实现方式 

为了实现这些目标,并考虑到实现简单,我们选用 Java 的动态代理类模型。

外部调用者调用 API 时,得到一个动态代理(Proxy) 对象,通过 Proxy 对象,将功能接口的调用全部转接到一个实现了 InvocationHandler 接口的类 ProxyHandler 上。

再根据调用方法,执行注册/注销回调或者将调用请求分派到真正的实现类上,最后根据接口的返回类型进行返回或回调,如图 3.1 所示。

云信IM SDK接口设计实践

Figure 3功能调用流程

和用户服务的接口类 AuthService 和 AuthServiceObserver 一样, SDK 也为其他的所有业务定义了接口类。

所有接口类和实现类呈一一对应关系,可以方便地找到 API 对应的实现。

 (二)获取Proxy对象的方法 

SDK对外提供了静态方法 NimClient.getService(Class<T> clazz) 来获取业务接口类对应的动态代理类。参数填入对应的接口类即可。

例如:获取用户认证服务的接口类的方式为:

NimClient.getService(AuthService.class),获取用户认证服务观察者的接口类的方式为 NimClient.getService(AuthServiceObserver.class)。

NimClient.getService 方法同步返回一个 Proxy 对象。该对象的构造方式为懒加载,业务被调用的时候才构造对应实例。如图 3.2 所示。

云信IM SDK接口设计实践

Figure 4获取业务Proxy对象流程

生成 Proxy 对象基于 Proxy.newProxyInstance 方法,所有生成的 Proxy 对象都由专门的容器类来管理。

以用户认证服务为例,名列前茅次调用 NimClient.getService(AuthService.class) 获取用户认证服务的 Proxy 对象时,容器理类创建一个对应的 Proxy 对象并缓存。

之后再次获取用户认证服务 Proxy 对象时,容器类将缓存直接返回。

(三) 事物跟踪类 

Invoke 函数中有一个重要的事务跟踪类 (Transaction),它记录了方法的同步异步属性、方法体和返回值要求等。Transaction 对象和他的实现方法是一一对应的。每次执行 invoke 方法,都会创建一个 Transaction 实例,并传输到真正的执行点去执行。

执行完毕后, invoke 方法根据同步异步特性以及返回值,来确定功能函数的返回结果。如果是同步函数,则直接返回结果;如果是异步函数,则根据业务需求返回 InvocationFuture 或者 AbortableFuture。

 (四)API的执行方式 

NimClient.getService 返回的是动态代理类 ProxyHandler,它实现了 InvocationHandler 接口的 Object invoke(Object who, Method method, Object[] args) 方法,用于代理所有功能接口。

API 执行方式,即 ProxyHandler 对 invoke 方法的实现方式,其大体步骤是加载事务、初始化判断、执行事务和返回,如图 3.3 所示。

云信IM SDK接口设计实践

Figure 5代理执行的简要流程

执行事务这一环节还可以细分为回调接口的执行和功能接口的执行,如果是执行回调接口,则判断是否需要回调当前状态,如果是,则立即回调。

Transaction 的执行函数是 TransactionExecutor. execute 方法,送出 Transaction 后, invoke 方法会根据同步异步属性,决定是在当前线程执行,还是在后台线程执行。用于异步执行 Transaction 的后台线程是少数的,如果有多个 Transaction 需要被异步执行,则会阻塞。

接口类的每个方法都被存进一个 Map 中, SDK 以方法签名实现了同名函数重载。执行 Transaction 时,通过方法所在的接口类找到对应的实现类,再调用对应的 invoke 方法即可。对于异步方法, invoke 方法的返回值不会被返回到上层,因此异步 API 函数的实现不用关心返回值。代理的详细执行流程如图 3.4 所示。

云信IM SDK接口设计实践

Figure 6代理的详细流程

(五) 异步方法的回调

对于异步方法,在 TransactionExecutor. execute 执行前,先基于 Transaction 生成对应的 AbortableFuture 的实现类 TransactionFuture ,然后将其缓存,用于稍后的回调。异步方法执行完毕后,将子类返回到调用层。

在调用可中断异步接口后,同步返回的是 AbortableFuture 实例。调用方可以直接调用abort 方法中止执行。

例如:调用了用于下载消息附件的 downloadAttachment 函数后,由于文件太大,网络状况不好等情况需要取消下载时,可以主动调用 abort 方法来终止。调用方式如图 3.5 所示。可中断异步接口对应的 abort 方法由 SDK 内部实现,调用者不需要关心其实现方式。

云信IM SDK接口设计实践

Figure 7abort函数调用示例

TransactionFuture 回调的基本类型为 RequestCallback,SDK 在此基本类型中定义了 onSuccess、onFailed 和 onException 函数,分别用于在成功、失败和异常情况下根据执行结果的不同,回调到不同的函数。到此整个流程结束。

四、总结

云信 IM 中,用户可以通过 NimClient.getService 方法选择业务的动态代理,然后根据业务需求在调用线程或者后台线程执行功能,最后直接返回或者回调结果。

如果调用的是可中断异步接口,用户还可以中断操作。基于动态代理的实现方式,隔离了其他业务下的对外接口,并解耦了接口和实现,配合代码混淆,更进一步的提升隔离效果。

作者介绍

陈吉力,网易智慧企业高级 Android 开发工程师。本硕就读于电子科技大学,毕业后从事云信 IM SDK Android 端的开发工作,喜爱篮球,羽毛球等。

关于网易云信

网易云信:网易智企旗下融合通信云服务专家、通信与视频 PaaS 平台。集网易 24 年 IM 以及音视频技术打造的融合通信云服务专家,稳定易用的通信与视频 PaaS 平台。提供融合通信与视频的核心能力与组件,包含 IM 即时通讯、5G 消息平台、一键登录、信令、短信与号码隐私保护等通信服务,音视频通话、直播、点播、互动直播与互动白板等音视频服务,视频会议等组件服务,并联合网易易盾推出一站式安全通信方案「安全通」。目前,网易云信已经成功发送 1.6 万亿条消息,覆盖智能终端 SDK 数累计超过 186 亿,我们期待每个智能终端都有云信的融合通信能力。

文章标题:云信IM SDK接口设计实践,发布者:网易智企,转载请注明出处:https://worktile.com/kb/p/6000

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
网易智企的头像网易智企认证作者
上一篇 2022年3月17日 上午12:42
下一篇 2022年3月17日 上午12:47

相关推荐

  • 任务调度系统需要什么技术

    任务调度系统需要以下技术:一、数据库技术;二、分布式计算技术;三、消息队列技术;四、安全技术;五、监控技术;六、自动化部署技术;七、分布式存储技术;八、人工智能技术。任务调度系统需要一个可靠的数据库来存储任务、调度信息和执行结果。 一、数据库技术 任务调度系统需要一个可靠的数据库来存储任务、调度信息…

    2023年4月16日
    65300
  • 因果矩阵编程有什么好处

    因果矩阵编程的好处主要体现在三个方面:1、提高代码的可读性和可维护性;2、优化数据处理和分析流程;3、增强算法的预测准确性。在这些好处中,提高代码的可读性和可维护性尤为重要。通过将复杂的逻辑和流程明确表示在矩阵形式中,程序员可以更直观地理解代码的逻辑结构,从而在后期的代码维护和升级中,更加快速地定位…

    2024年4月27日
    1600
  • 公寓管理系统软件功能都有哪些

    公寓管理系统软件功能有:1、租客、主人方面;2、公寓物业方面;3、远程抄表功能;4、物业费收取功能。需要分为2个模块,一个模块是租客端,一个模块是业主端。租客可以根据系统进行在线签订合同,房租支付、预约看房、保洁维修等服务。 一、租客、主人方面 需要分为2个模块,一个模块是租客端,一个模块是业主端。…

    2023年4月30日
    39600
  • 律所oa系统

    律师事务所的办公自动化(OA)系统对于提高工作效率、简化日常行政管理、促进信息共享和协作至关重要。这类系统通常集成了多种功能,1、如案件管理 2、时间和费用跟踪 3、客户关系管理 4、文档管理 5、通信工具,还可能包括报告和分析功能。案件管理作为OA系统的核心组成部分,它使律师能够轻松跟踪案件进展,…

    2024年1月12日
    30100
  • 在家学编程需要什么设备

    在家学习编程需要以下几样设备:1、性能合适的计算机、2、稳定的互联网连接、3、必要的软件工具、4、外围设备。其中,性能合适的计算机是最关键的。一个良好的学习体验往往始于一台能够无障碍运行编程软件和应用程序的计算机,这也意味着它应该具备足够的处理能力和内存。你不需要最高端的设备,但确保你的机器能够顺畅…

    2024年4月27日
    1000
  • 如何通过API与第三方工具扩展知识库功能

    通过API与第三方工具扩展知识库功能的方法:1、理解API与集成的基本概念;2、选择适用的API;3、明确扩展的功能需求;4、选择适合的第三方工具;5、实施API集成;6、测试集成功能;7、文档和培训;8、监控和反馈机制;9、安全性和隐私保护。通过API与第三方工具的集成,可以为知识库带来更广泛、更强大的功能。

    2023年11月17日
    34700
  • 学数控编程需要什么指令

    摘要 学习数控编程需掌握几项基础:1、基本的G代码和M代码、2、编程逻辑与流程。 在这些中,基本的G代码和M代码尤为关键。这些代码构成了程序的骨架,告诉机床如何移动、加工速度如何调整以及何时停止。精通这些代码是高效、准确完成编程任务的前提。 一、G代码和M代码的基础 G代码(Geometric Co…

    2024年4月27日
    1100
  • DNS根服务器是什么

    DNS根服务器是域名系统(DNS)的较高级别的服务器。它们负责解析拔尖域(如.com、.org、.net等)的域名服务器的地址。当你在浏览器中输入一个网址时,你的计算机会首先向DNS根服务器查询这个网址对应的IP地址。 一、DNS根服务器的定义 DNS根服务器是域名系统(DNS)的较高级别的服务器。…

    2023年7月29日
    52400
  • 建筑直营项目如何管理营销

    管理营销对于建筑直营项目至关重要,它包括市场研究、品牌建设、客户关系管理、销售策略和数字营销等多个方面。其中,品牌建设是核心,因为它不仅能够提高项目的知名度、但也是塑造项目形象、吸引潜在客户的关键。品牌建设包括制定品牌战略、设计品牌标识(如logo)、确定品牌口号、以及通过各种渠道对品牌进行推广。通…

    2024年4月10日
    6400
  • 景观公司项目如何规划管理

    景观公司项目的规划管理主要涉及几个重要环节:目标设置、资源分配、进度控制、风险管理、沟通协调。在项目管理中,重要的是确立项目目标和范围、施工图设计的准确性、资源的合理配置以及风险评估和应对措施的制定。其中,进度控制尤为关键,它要求项目经理不仅要在项目启动前规划出详尽的时间表,还要在执行过程中不断地监…

    2024年4月10日
    6900

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部