RPC原理与实现 | 青训营笔记

38 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天,参与青训营的第26天。今天主要学习了分布式理论。

远程函数调用(RPC Remote Procedure Calls)

模型组成:User、User-Sub、RPC-Runtime、Server-Sub、Server

一次RPC的完整过程:

IDL(Interface description language)文件 IDL通过一种中立的方式来描述接口,使得不同平台上运行的对象和用不同语言编写的程序可以相互通信。

生成代码

通过编译器工具把IDL文件转换成对应的静态库 编解码 从内存中表示到字节序列的转换称为编码,反之为解码 也常叫做序列化和反序列化

通信协议

规范了数据在网络中传输内容和格式,除必须的请求/响应数据外,通常还会包含额外的元数据

网络传输

通常基于成熟的网络库走TCP/IP传输

好处

1.单一职责,有利于分工协作和运维开发 2.可塑性强,资源使用率优 3.故障隔离,服务的整体可靠性更高。

对比本地函数调用有众多优势,但也产生了很多问题。

RPC框架

数据格式

编解码层

语言特定的格式

许多编程语言都内建了将内存对象编码为字节序列的支持。

文本格式

JSON,XML,CSV等文本格式,具有人类可读性

二进制编码

具备跨语言和高性能等优点,常见的有Thrift的Binary Protocol,Protocol等。

二进制编码

TLV编码 tag:标签,可以理解为类型 Length:长度 Value:值,Value也可以是个TLV结构

选型

兼容性

支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度

通用性

支持跨平台,跨语言

性能

从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。

协议层

特殊结束符

一个字特殊字符作为每个协议单元结束的标示

边长协议

以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度

网络通信层-网络库

提供易用API 封装底层Socket API 连接管理和时间并发

功能

协议支持:TCP、UDP和UDS等 优雅退出,异常处理等

性能

应用层buffer减少copy 高性能定时器,对象池等

关键指标

保障策略

熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路 限流:保护被调用方,防止大流量把服务压垮 超时控制:避免浪费资源在不可用节点上。

今日总结

从本地函数调用到RPC,RPC架构中以编解码层,协议层,网络传输层三层为核心,保证了RPC框架的稳定性,可扩展性,并实际学习了字节跳动内部的Kitex相关实践。