这是我参与「第五届青训营 」伴学笔记创作活动的第 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相关实践。