干货丨KingbaseES中的RPC介绍
互联网的发展,应用的规模不断扩大,导致各行业对于数据库处理能力需求不断增长,数据库横向扩展需求以及频繁的跨节点操作需求随之提升,用户对于数据库RPC能力提出较高要求。那么,RPC是什么?RPC能够解决什么问题?本篇将以KingbaseES中的RPC为例向大家进行系统介绍。
RPC是什么
RPC是远程过程调用(Remote Procedure Call)的缩写,论文《Implementing remote procedure calls》最早提出了RPC的概念。RPC提供了完成远程调用的能力而且不损失本地调用的语义。
KingbaseES在各类集群架构中都需要跨节点的操作,KingbaseES实现了RPC能力以便这些需要跨节点操作可以被更简单的实现。
RPC解决的问题
为了透明的实现远程调用,RPC需要解决以下问题:
1.client如何从server端获取可用的接口列表
不同于各类RPC框架,KingbaseES的RPC只用于产品内部,原则上可以在编译时导出列表。但KingbaseES的集群部署中需要在升级时保持节点间的互操作性以支持滚动升级,所以也支持了动态获取接口列表并支持向前兼容。
2.client和server端的连接建立
由于只需支持节点间的连接,目前选择在部署自动生成节点间的连接配置。
3.传输协议选择
选择还是基于开发的便利性,基于KingbaseES本身使用了TCP/IP协议的原生接口,可以基于已有的代码简单封装。
4.调用的参数传输
a)参数序列化
KingbaseES提供各类基础数据类型的参数传输,包括传值参数(定长数据类型)和引用参数(指针+长度的形式)。
b)在支持跨平台部署的产品中,处理不同字节序主机间的参数传输
目前的RPC支持了定长类型的字节序透明处理。
5.通信连接模型选择
a)一进程一连接
每个client进程独占一个到server进程的连接。这种模型优点是独占连接可以保证每个client的请求不互相影响可以及时处理,缺点是在连接规模增加时,进程的上下文切换会越来越频繁,性能损耗大。
数据库经常会处理高并发,保有千级别的活动连接,在集群架构下这种模型的连接数也会随着节点数增加而增长,造成巨大的性能损耗。
b)多进程一连接
A模型的优化版本,为了减少连接数,多个client进程连接到本节点的一个通信进程,通信进程连接到一个server进程。server进程根据会循环接收报文,然后根据收到的报文进程内调用过程的handler。这种模型优化了连接数,但单个server进程处理请求上容易发生瓶颈,一个请求的响应时间超长就会阻塞全部请求。
c)多进程多连接
B模型的优化版本,通过增加通信进程数量增加吞吐量。
基于KingbaseES集群目前支持的节点数量和每个节点的连接数,RPC实现选择了模型C。大部分的RPC处理都是延迟很小的操作,不会出现对于单个调用阻塞一个连接的情况,对于少数需要I/O或封锁等待的操作,选择在Server端实现异步调用避免等待。
6.RPC和本地调用的语义差异
RPC故障情况下的语义和本地调用不同,KingbaseES选择了如下的RPC语义
a)本发送成功前的错误按调用错误处理
b)发送后有返回的情况下,返回值正确描述server端执行的结果
c)发送后网络超时或错误时, 支持重试直到收到节点变更通知或完成重试,完成至少一次的调用语义。client需要根据调用的幂等性选择。