RPC 是服务化架构的 IM 系统中一个非常重要的核心组件,其在整个服务化架构系统中的应用位置见下图。
- 入口服务层服务(如 entry) 通过 RPC 调用业务服务层服务(如用户 logic);
- 业务服务层服务(如系统消息 extlogic)通过 RPC 调用数据服务层服务(如消息 das)。
这里我们仍然不讨论具体的 RPC 框架的技术选型和内部实现,我们仍然从普适性的角度分析 RPC 应该提供哪些服务能力。
在具体应用时 RPC 往往作为 lib 库或 jar 包嵌入在应用程序中运行,RPC 框架分为 RPC 的客户端框架和 RPC 的服务端框架,从大多数 RPC 框架中我们抽象出普适的 RPC 框架模型,包括 RPC 客户端框架模型和 RPC 服务端框架模型,见下图。
- RPC 客户端框架模型业务逻辑代码(Business Logic) 调用服务提供方的接口,最终都会由 Proxy(动态代理)的统一的方法(invoke 方法)来处理;在该方法中,首先将请求对象序列化成二进制流,然后分别经过路由选择和负载均衡来确定下游的服务提供方的节点;再由连接管理( 或服务连接池)将二进制流发送到下游节点;发送请求后,若对应的响应包按时返回,则将其反序列化成响应对象交给 Proxy 统一处理;若对应的响应包没有按时返回,则走超时流程,仍然由 Proxy 统一处理;整个流程一定是闭环的。
- RPC 服务端框架模型在 RPC 服务端,通常会有一个 IO 线程接收 RPC 客户端发送的请求;接收到的二进制流,首先反序列化成请求对象,然后将请求对象写入请求队列 ;再开启一个工作线程池,由工作线程从请求队列中获取请求后进行相应的业务逻辑处理,服务提供方对接口的实现逻辑就是由这里的工作线程池进行处理的;对业务请求处理后的结果进行序列化转换成二进制流后由 IO 线程返回到 RPC 客户端;至此,整个 RPC 框架对请求的处理流程完全闭环。
分析完 RPC 的框架模型,就可以从中抽象和梳理出一个普适性的 RPC 框架应该提供的服务能力项了。
- 路由选择:路由选择提供按一定规则过滤下游服务提供方节点列表的能力,比如对服务提供方集群中的节点进行分组,通过路由选择可以确定本次请求发送到哪一组;路由选择的能力通常用于 “灰度发布” 或 “应用隔离”;
- 负载均衡:负载均衡位于【路由选择】之后,通过路由选择确定请求发送的分组后,就可以通过负载均衡确定请求具体发送到哪一个服务节点;负载均衡确保下游的多个服务提供方节点接收到的请求量是合理的,常用的负载均衡算法有:轮询均衡算法、随机均衡算法、轮询权重均衡算法、随机权重均衡算法、随机轮询权重均衡算法等;
- 连接管理:连接管理模块建立和维护与下游所有服务提供方节点的连接,这些连接往往以【服务连接池】的形式存在;根据应用场景不同,连接的初始化时机包括 “饿汉模式” 和 “懒汉模式” ;
- 超时处理:对长时间下游服务没有返回数据的对应的请求,需要按超时处理,以及时通知上层业务进行业务逻辑处理并释放资源;超时处理在 “RPC 同步调用” 和 “RPC 纯异步调用” 两种情况下有不同的处理方式;
- 任务优先级:在下游的服务提供方,需要通过多队列工作模式提供任务优先级,以对不同优先级的任务请求进行隔离,防止相互影响;队列在很多底层框架和引擎构件中都普遍应用,在 RPC 框架中,除了起到请求的削峰填谷外,也是 I/O 线程 与 Worker 线程交互的最佳方式,同时提供了多任务优先级实现的便利性;
- 过载保护:当服务端负载较大,任务请求积压时,需要具备过载保护的能力,即在队列中挤压的请求量超过设定的阈值时,需要对入队的请求进行丢弃操作;同时当请求在任务队列中积压时间过长,上游 RPC 客户端已经对该请求进行了超时处理,此时出队的请求,服务端需要具备超时丢弃的能力;
- 优雅关闭:服务提供方会因需求迭代而频繁进行服务升级和重启,如何防止请求队列中的任务请求被粗暴对待,服务端需要具备优雅关闭的能力(见 IM专题:服务化架构IM系统(5)— 优雅上线)。
RPC,即远程过程调用,在服务化的系统中实现了服务之间的通讯,RPC最核心的意义在于,它实现了像调用本地方法一样来调用远程方法,也就是方法的运行已经不局限于本地内存了,它基于多台机器扩展了算力,是 分布式 落地的根本和基础。
我们把 RPC 看做一个黑盒子,RPC 的服务提供方对业务接口进行了 “实现”,而RPC 的服务消费方对业务接口进行了 “调用”,那么问题来了:服务消费方和服务提供方是两个独立的进程,服务消费方进程中只有服务的 “接口” 而没有服务的 “实现”,既然没有 “实现”,服务消费方是怎么做到方法调用的呢?
这个问题涉及到了 RPC 内核的实现原理,同时,路由选择、负载均衡、连接管理、超时处理、任务优先级、过载保护、优雅关闭等几项服务能力又是怎么实现的呢?我们在后续的文章中逐步解析。
最后,总结文中关键:
- 在服务化架构的 IM 系统中,RPC 主要应用在入口服务层、业务服务层和数据服务层之间的调用;
- 普适性的 RPC 框架模型组件,包括:
- Proxy
- 序列化 / 反序列化
- 路由管理
- 负载均衡
- 连接管理
- 超时管理
- I/O 线程
- 线程池
- 队列
- 普适的 RPC 需要提供的服务能力项,包括:
- 路由选择
- 负载均衡
- 连接管理
- 超时处理
- 任务优先级
- 过载保护
- 优雅关闭
作者:棕生;
来源:架构之魂
原文:https://mp.weixin.qq.com/s/eWQXw6p9TWiNxHS6T0dQkg
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。