背景
测试同学在写自动化case时遇到了和RPC相关的问题,帮他们解答时顺便理一理自己的思路。记录在这里防止有什么遗漏。
这里使用“2W1H”原则,即从Why -> What -> How的方式来进行分析。如果有哪里写的不对,欢迎指出:)
Why - 为什么要用RPC
RPC(Remote Procedure Call),远程过程调用,顾名思义,最开始用于两台不同的通信之间设备,底层通信协议多为http。
在YoC系统中, 所有线程当然都运行在同一台设备上,依然可以使用RPC架构,将其运用在C/S (Client/Server)间通信。
为什么要使用C/S架构呢?
我们先看函数直接调用,例如main()函数调用加法函数add()执行加法操作,两个函数顺序执行,运行同一个线程中。这个例子中加法函数功能简单,不会出现问题。
但如果是很复杂的函数,比如下面伪代码:
main() {
... fun1(); //执行复杂的操作,需要很长时间执行
... fun2(); //执行复杂的操作,需要很长时间执行
...
{
如果fun1(), fun2()都需要很复杂的执行过程,整个流程就会卡在这里,等他们执行完成后才能继续往下运行。这样的函数一多,势必会影响整体性能。
此外,在多线程处理环境中,如果有多个main()函数同时运行,意味着多个fun1()和fun2()会同时运行,所以这些函数在实现时为了保证可重入性,一方面需要复杂的保护逻辑,一方面需要通过加锁/释放锁避免访问冲突,再次损失了性能。
而在C/S架构中,Client端负责与用户完成交互任务,Service端负责数据处理。这么做有以下几个好处:
- 低耦合:不同的Service分布在不同的线程上,减少了不同功能间的相互依赖,提升软件质量
- 负载均衡:负载均衡其实是QoS里面的一个概念,用在这里形象的解释了其对性能的提升。在上面的例子中,将fun1()/fun2()分别作为两个不同的service, main()函数(相当于Client)通过RPC发送服务请求,不需要等待服务结束就可以往下执行。Client端一般只执行轻量级函数,可以及时反馈用户交互任务,将需要消耗资源和时间的处理都交由Service来执行。
- 易于设计:在设计微服务时,可以使用任务队列的方式(如下面介绍),将并行访问转换为顺序执行,避免了重入带来的复杂控制和资源保护,提升性能以及软件的鲁棒性。
RPC为C/S架构提供了跨线程通信框架,使得用户可以像访问本地函数一样访问微服务。
What - 什么是RPC
通过刚刚的介绍,我们对微服务/RPC有了大体的了解。一个典型的RPC通信包括如下几个步骤:
Client端通过暴露出来的接口调用Service服务
uService(微服务模块)打包该请求,将任务请求发送到任务队列
serviceTask (服务任务模块)按照先入先出顺序读取任务并实现任务分发
可以看到,YoC上RPC的底层通信机制采用了消息队列。
以media提供的微服务为例,通信框架如下图所示:
上面介绍的RPC通信都是异步通信,即调用方不需要等待服务运行完成就可以继续执行后面的操作。RPC也可以是同步通信,调用方必须要等待被调用接口运行完成后,才能执行后续操作。根据业务需要,客户端可以灵活选择同步或异步通信。
How - RPC是如何实现的
下面以media提供的微服务为例,介绍RPC同步通信是如何在YoC系统上运行的。
流程图如下所示:
整个流程步骤如下(和图中数字所对应):
- 启动时,由应用程序(app_main)初始化服务任务线程,以及media微服务
- 服务任务线程是一个无限循环,不断尝试去消息队列读取任务信息并处理
- 应用程序发起RPC调用,本例中调用函数是aui_player_get_time
- RPC调用最终通过微服务,将函数打包成消息,送入消息队列。消息队列采用先进先出的执行顺序
- 微服务得到返回值,标识消息是否发送成功(注意:这里的返回值和被调用函数是否运行成功并没有关系)
- 由于是同步通信,客户端需要等待被调用函数执行完成
- 服务任务线程从消息队列中取到该消息,并进行分发处理
- 处理后调用真正的执行函数:_get_time
- 执行后将得到的结果送入rpc_buffer
- 告知客户端,函数调用已经执行完成
- 继续去消息队列取消息,处理下一个RPC调用
- 客户端收到”处理完成“通知后,去rpc_buffer读取执行结果
- 读到的结果作为最终输出
和同步调用相比,异步调用更加简单,即客户端调用完成后不需要得到RPC调用的结果,也不需要等待。异步调用没有⑥,⑨,⑩,⑫,⑬这5个步骤。
简单介绍就到这里了,具体还需要通过阅读代码加深理解。我也会随着自己的理解加深而更新本篇博文。 如果有问题,欢迎站内信向我咨询。
文章来源:芯片开放社区
文章链接:https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.1b87180fOJm8Ux&id=3785142460343791616