这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记。
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
-
微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
-
将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
- 重试
- 重试
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。
扩展性设计
性能优化
这是我参与「第三届青训营 -后端场」笔记创作活动的的第10篇笔记」
基本概念
本地函数调用
远程函数调用
- RPC需要解决的问题
- 函数映射
- 本地根据函数指针指定函数体,远程是两个进程,地址空间完全不一样,每个函数需要自己的id,根据id对应关系映射)
- 数据转换成字节流
- 本地参数可压栈(本地通过内存传参), 远程的客户端服务器地址不同,需要转换字节流
- 网络传输
- 函数映射
RPC 概念模型
- 组成:User, User-stub,RPC-Runtime,Server-Stub, Server
一次RPC的完整过程
- IDL:双方不知道对方有哪些调用方法,需要协商调用方式
RPC的好处
- 单一职责,有利于分工协作和运维开发,每个服务都是可独立进行开发
- 可扩展性强,资源使用率更优
- 资源利用率:底层服务可复用,双十一只需对shopping服务进行改进扩容等等
- 故障隔离,服务的整体可靠性更高
RPC带来的问题
- 服务宕机,对方应该如何处理
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC框架
分层设计
编解码层
-
生成代码
-
数据格式
- 语言特定的格式,内置将内存对象编码为字节序列的支持,java.io.Serializable,缺点是语言限制
- 文本格式, 人类可读性,但描述不严谨,json字符串无法区分整数浮点数
- 二进制编码,具备跨语言和高性能等优点,Thrift的BinaryProtocol,Protobuf等
-
二进制编码 TLV编码缺点:增加了typeof length 冗余信息,开销增大。 自行了解改进空间。
-
选型
- 兼容性:支持自动增加新的字段,而不影响老的服务,将提高系统的灵活度
- 通用性:支持跨平台、跨语言
- 性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长。
协议层
-
概念
-
协议构造
-
协议解析 MagicNumebr?
网络通信层
-
Sockets API
-
网络库,使用封装好的工具
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持:tcp udp uds等
- 优雅退出,异常处理等
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池等
- 提供易用API
关键指标(构建RPC框架)
稳定性
- 保障策略
- 熔断:保护调用方,防止被调用的服务出现问题(一直超时等待,堆积大量请求)而影响整个链路
- 限流,防止大流量把服务(被调用方)压垮
- 超时控制:避免浪费资源在不可用节点上
- 请求成功率(如何提高)
- 负载均衡,防止每个节点压力过大
- 长尾请求 backup request提高请求成功率 req1发出后,认为应在t3时间内返回
- 注册中间件
易用性
- 开箱即用,合理的默认参数选项、丰富的文档
- 周边工具, 生成代码工具、脚手架工具
扩展性
- 中间件
- 可选参数
- 编解码层- 不同,可选
- 协议层- 不同,可选
- 传输层- 不同,可选
- 生成工具插件扩展
观测性
- 三件套: log metric tracing
- 内置观测性服务,了解框架内部的运行状况,例如:linux中的top
高性能
- 目标:高吞吐和低延迟
- 场景
- 单机多机
- 单连接 多连接
- 单、多client or server
- 不同大小的请求包
- 手段
- 连接池 (复用,提高资源利用率)
- 多路复用
- 高性能编解码协议
- 高性能网络库
- 不同请求类型
企业实践
整体架构(Kitex)
- kitex core 核心组件
- kitex byted 与公司内部基础设施集成
- kitex tool 代码生成工具
自研网络库
背景
- 原生库无法感知连接状态,在使用连接池时,池中存在失效连接,影响连接池的复用
- 原生库存在goroutine暴涨的风险,一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能
合并部署
- 微服务过微,传输和序列化开销越来越大,但不可能把已经上线的服务进行合并,每个服务负责的团队也不同
- 将亲和性强的服务实例尽可能调度到同一个物理机上,远程RPC调用优化为本地IPC调用。