IM专题:服务化架构IM系统(8)— 应用RPC

RPC 是服务化架构的 IM 系统中一个非常重要的核心组件,其在整个服务化架构系统中的应用位置见下图。

IM专题:服务化架构IM系统(8)— 应用RPC
  • 入口服务层服务(如 entry) 通过 RPC 调用业务服务层服务(如用户 logic);
  • 业务服务层服务(如系统消息 extlogic)通过 RPC 调用数据服务层服务(如消息  das)。

这里我们仍然不讨论具体的 RPC 框架的技术选型和内部实现,我们仍然从普适性的角度分析 RPC 应该提供哪些服务能力。

在具体应用时 RPC 往往作为 lib 库或 jar 包嵌入在应用程序中运行,RPC 框架分为 RPC 的客户端框架和 RPC 的服务端框架,从大多数 RPC 框架中我们抽象出普适的 RPC 框架模型,包括 RPC 客户端框架模型和 RPC 服务端框架模型,见下图。

IM专题:服务化架构IM系统(8)— 应用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 内核的实现原理,同时,路由选择、负载均衡、连接管理、超时处理、任务优先级、过载保护、优雅关闭等几项服务能力又是怎么实现的呢?我们在后续的文章中逐步解析。

最后,总结文中关键:

  1. 在服务化架构的 IM 系统中,RPC 主要应用在入口服务层、业务服务层和数据服务层之间的调用;
  2. 普适性的 RPC 框架模型组件,包括:
    • Proxy
    • 序列化 / 反序列化
    • 路由管理
    • 负载均衡
    • 连接管理
    • 超时管理
    • I/O 线程
    • 线程池
    • 队列
  3. 普适的 RPC 需要提供的服务能力项,包括:
    • 路由选择
    • 负载均衡
    • 连接管理
    • 超时处理
    • 任务优先级
    • 过载保护
    • 优雅关闭

作者:棕生;
来源:架构之魂
原文:https://mp.weixin.qq.com/s/eWQXw6p9TWiNxHS6T0dQkg

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论