RPC框架笔记

news2024/11/19 15:34:15

文章目录

  • RPC概述
    • 一次RPC的完整过程
    • RPC的优缺点
  • 分层设计
    • 编解码层——数据格式
    • 协议层——概念
    • 网络通信层——网络库
  • RPC框架的关键指标
    • 稳定性
    • 易用性
    • 扩展性
    • 观测性
    • 高性能
  • Kitex框架解读
    • 整体框架
    • 自研网络库——Netpoll
      • 扩展性设计
      • 性能优化——网络库优化
      • 性能优化——编解码优化
      • 合并部署

RPC概述

1.本地函数调用和RPC调用的区别:函数映射、数据转成字节流、网络传输
2.RPC的概念模型:User、User-Stub、RPC-Runtime、Server-Stub、Server
3.一次RPC的完整过程
4.RPC带来好处的同时也带来了不少的问题,将由RPC框架来解决

一次RPC的完整过程

在这里插入图片描述

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

生成代码:
通过编译器工具把IDL文件转换成语言对应的静态库

编解码:
从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化

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

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

RPC的优缺点

RPC的好处

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

RPC带来的问题
1.服务宕机,对方应该如何处理?
2.在调用过程中发生网络异常,如何保证消息的可达性?
3.请求量突增导致服务无法及时处理,有哪些应对措施?

分层设计

在这里插入图片描述

编解码层——数据格式

语言特点的格式:
	许多编程语言都内建了将内存对象编码为字节序列的支持,例如Java有java.io.Serializable
文本格式:
	JSON、XML、CSV等文本格式,具有人类可读性

二进制编码:
	具备跨语言和高性能等优点,常见有Thrift、BinaryProtocol,Protobuf等
	TLV编码:
	-Tag:标签,可以理解为类型
	-Length:长度
	-Value:值,Value也可以是个TLV结构
struct Person{
	1:required string userName,
	2:optional i64 favoriteNumber,
	3:optional list<string> interests
}

编解码——选型
1.兼容性:支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
2.通用性:支持跨平台、跨语言
3.性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长

协议层——概念

特殊结束符:
一个特殊字符作为每个协议单元结束的标示
在这里插入图片描述
变长协议:
以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

网络通信层——网络库

提供易用API

封装底层Socket API
连接管理和事件分发

功能

协议支持:tcp、udp和uds等
优雅退出、异常处理等

性能

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

RPC框架的关键指标

1.框架通过中间件来注入各种服务治理策略,保障服务的稳定性
2.通过提供合理的默认配置和方便的命令行工具可以提升框架的易用性
3.框架应当提供丰富的扩展点,例如核心的传输层和协议层
4.观测性除了传统的Log、Metric和Tracing之外,内置状态暴漏服务也很有必要
5.性能可以从多个层面去优化,例如选择高性能的编解码协议和网络库

稳定性

1.稳定性——保障策略

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

2.稳定性——请求成功率
负载均衡:
在这里插入图片描述
重试:
在这里插入图片描述

3.稳定性——长尾请求

什么是长尾请求?

长尾请求一般是指明显高于均值的那部分占比较小的请求。 业界关于延迟有一个常用的P99标准, 也就是99%的请求延迟要满足在一定耗时以内, 1%的请求会大于这个耗时, 而这1%就可以认为是长尾请求。

长尾请求出现的原因?

共享资源竞争, 周期性的垃圾回收, 运维活动(比如日志备份), 硬件或者软件故障,网络的抖动,都有可能造成。

正常的请求:
在这里插入图片描述
长尾请求:超过正常请求应该的响应时间后,发送备用请求
在这里插入图片描述

易用性

开箱即用

合理的默认参数选项、丰富的文档

周边工具

生成代码工具、脚手架工具

在这里插入图片描述
在这里插入图片描述

扩展性

1.Middleware
2.Option
3.编解码层
4.协议层
5.网络传输层
6.代码生成工具插件扩展
在这里插入图片描述

观测性

Log、Metric、Tracing

内置观测性服务

在这里插入图片描述

高性能

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Kitex框架解读

整体框架

在这里插入图片描述
Kitex Core:核心组件
Kitex Byted:与公司内部基础设施集成
Kitex Tool:代码生成工具

自研网络库——Netpoll

为什么自研网络库?

原生库无法感知连接状态
在使用连接池时,池中存在失效连接,影响连接池的复用

原生库存在goroutine暴涨的风险
一个连接一个goroutine的模式,由于连接利用率低下,存在大量goroutine占用调度开销,影响性能

Netpoll:

解决无法感知连接状态问题:
	引入epoll主动监听机制,感知连接状态
解决goroutine暴涨的风险:
	建立goroutine池,复用goroutine
提升性能:
	引入Nocopy Buffer,向上层提供NoCopy的调用接口,编解码层面零拷贝

扩展性设计

支持多协议,也支持灵活的自定义协议扩展
在这里插入图片描述
在这里插入图片描述

性能优化——网络库优化

调度优化
		epoll_wait在调度上的控制
		gopool重用goroutine降低同时运行协程数
LinkBuffer:
		读写并行无锁,支持nocopy地流式读写
		高效扩缩容
		Nocopy Buffer池化,减少GC
Pool:
	引入内存池和对象池,减少GC开销

性能优化——编解码优化

Codegen
	预计算并预分配内存,减少内存操作次数,包括内存分配和拷贝
	lnline减少函数调用次数和避免不必要的反射操作等
	自研了Go语言实现的Thrift IDL解析和代码生成器,支持完善的Thrift IDL语法和语义检查,并支持了插件机制——Thriftgo

JIT
	使用JIT编译技术改善用户体验的同时带来更强的编解码性能,减轻用户维护生成代码的负担
	基于JIT编译技术的高性能动态Thrift编解码器——Frugal

合并部署

微服务过微,传输和序列化开销越来越大
将亲和性强的服务实例尽可能调度到同一个物理机,远程RPC调用优化为本地IPC调用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

中心化的部署调度和流量控制
基于共享内存的通信协议
定制化的服务发现和连接池实现
定制化的服务启动和监听逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flutter入门到进阶】Flutter基础篇---组件生命周期与状态

1 Android界面渲染流程UI树与FlutterUI树的设计思路对比 1.1 android渲染流程中的树的组织 1.1.1 XML加载与解析 1.1.2 ViewRootImpl组织树结构 1.1.3 编舞者掌控调用时机 1.1.4 View负责UI渲染 1.1.5 底层surfacefiling负责沟通硬件 1.2 flutter组件设计思路&#xff0c…

Canal实时监控案例

Canal实时监控案例 文章目录Canal实时监控案例0. 写在前面1. TCP 模式测试1.1 IDEA创建项目canal-module1.2 通用监视类——CanalClient1.2.1 Canal 封装的数据结构1.2.2 在 canal-module 模块下创建 cn.canal 包&#xff0c;并在该包下创建 CanalClient.java文件2. Kafka 模式…

前后端身份验证

1、web 开发模式 【】基于服务端渲染的传统 Web 开发模式 【】基于前后端分离的新型 Web 开发模式&#xff1a;依赖于 Ajax 技术的广泛应用。后端只负责提供 API 接口&#xff0c;前端使用 Ajax 调用接口的开发模式 2、身份认证 【】服务端渲染推荐使用 Session 认证机制 【】…

《堆的应用》TOP-K问题

TOP-K问题:即求数据中前k个最大的元素或者最小的元素&#xff0c;一般情况下&#xff0c;这些数据量是非常大的。 比如:专业前10名、世界500强、世界富豪榜、游戏中前100名等这些排名都是TOP-K问题。 来源于《财富》世界500强排行榜。 对于TOP-k问题&#xff0c;能想到的最简…

【XXL-JOB】XXL-JOB定时处理视频转码

【XXL-JOB】XXL-JOB定时处理视频转码 文章目录【XXL-JOB】XXL-JOB定时处理视频转码1. 准备工作1.1 高级配置1.2 分片广播2. 需求分析2.1 作业分片方案2.2 保证任务不重复执行2.2.1 保证幂等性3. 视频处理业务流程3.1 添加待处理任务3.2 查询待处理任务3.3 更新任务状态3.4 工具…

考研还是工作?两战失败老道有话说

老道入职第一周自我介绍谈谈考研谈谈工作新的启程自我介绍 大家好&#xff01;在下是一枚考研失败两次的自认为聪明能干的有点小帅的实则超级垃圾的三非名校毕业的自动化渣男。大一下就加入实验室&#xff0c;在实验室焊板子、画板子、培训、打比赛外加摸鱼&#xff1b;参加过…

Swagger扩展 - 同一个接口生成多份Swagger API文档

为同一个ApiOperation生成多份不同Swagger API文档。 0. 目录1. 背景2. 效果展示3. 实现3.1 关键逻辑 - 让接口自解释3.2 关键逻辑 - 如何生成相应的ApiDescription3.3 关键逻辑 - 如何为生成的ApiDescription 赋值3.4 关键逻辑 - 如何动态生成Docket4. 继续优化5. 参考1. 背景…

【Spark分布式内存计算框架——Structured Streaming】3. Structured Streaming —— 入门案例:WordCount

1.3 入门案例&#xff1a;WordCount 入门案例与SparkStreaming的入门案例基本一致&#xff1a;实时从TCP Socket读取数据&#xff08;采用nc&#xff09;实时进行词频统计WordCount&#xff0c;并将结果输出到控制台Console。 文档&#xff1a;http://spark.apache.org/docs/2…

一个Bug让人类科技倒退几十年?

大家好&#xff0c;我是良许。 前几天在直播的时候&#xff0c;问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的&#xff0c;居然没有一人能够答得上来的。 所以&#xff0c;今天就跟大家科普一下这个人类历史上最大的 Bug 。 1. 全世界的恐慌 一个Bug会让人类…

Java中的自动类型提升与强制类型转换

一、自动类型提升 自动类型提升是指在程序运行时因为某种情况需要&#xff0c;JVM将较小的数据类型自动转换为较大的数据类型&#xff0c;以保证精度和正确性。在Java中&#xff0c;需要进行类型提升的情况有以下几种&#xff1a; 1. byte、short和char提升为int类型 当运算…

spark sql(五)sparksql支持查询哪些数据源,查询hive与查询mysql的区别

1、数据源介绍 sparksql默认查询的数据源是hive数据库&#xff0c;除此之外&#xff0c;它还支持其它类型的数据源查询&#xff0c;具体的到源码中看一下&#xff1a; 可以看到sparksql支持查询的数据源有CSV、parquet、json、orc、txt、jdbc。这些数据源中前面五个我还能理解&…

【Python】RPA批量生成word文件/重命名及批量删除

批量生成word文件 场景&#xff1a;需要新建多个类似文件名 比如&#xff1a;今天的事例是新建12个文件名为&#xff1a; ​ 保安员考试试卷1及答案.docx ​ 保安员考试试卷2及答案.docx ​ … ​ 保安员考试试卷12及答案.docx 痛点&#xff1a; ​ 手动操作重复性高&a…

目标检测中回归损失函数(L1Loss,L2Loss,Smooth L1Loss,IOU,GIOU,DIOU,CIOU,EIOU,αIOU ,SIOU)

文章目录L-norm Loss 系列L1 LossL2 LossSmooth L1 LossIOU系列IOU &#xff08;2016&#xff09;GIOU &#xff08;2019&#xff09;DIOU &#xff08;2020&#xff09;CIOU &#xff08;2020&#xff09;EIOU &#xff08;2022&#xff09;αIOU (2021)SIOU &#xff08;2022…

【SpringCloud】SpringCloud详解之Eureka实战

目录前言SpringCloud Eureka 注册中心一.服务提供者和服务消费者二.需求三.搭建Eureka-Server四.搭建Eureka-Client(在服务提供者配置:用户订单)前言 微服务中多个服务&#xff0c;想要调用&#xff0c;怎么找到对应的服务呢&#xff1f; 这里有组件的讲解 → SpringCloud组件…

深圳大学《计算机论题》作业:大数据与人工智能技术对人类生活的影响

说明 本作业为小组作业&#xff0c;要求基于一场报告完成&#xff08;即观后感&#xff09;。共分4个小题&#xff0c;讨论人工智能时代的伦理思考。由于版权原因&#xff0c;不提供报告的具体内容&#xff0c;只展示答题内容。 第一题 &#xff08;1&#xff09; 你如何看待…

winform控件PropertyGrid的应用(使运行中的程序能像vistual studio那样设置控件属性)

上周在看别人写的上位机demo代码时&#xff0c;发现创建的项目模板是"Windows 窗体控件库"(如下图) 生成的项目结构像自定义控件库&#xff0c;没有程序入口方法Main&#xff0c;但却很神奇能调试&#xff0c;最后发现原来Vistual Studio启动了一个外挂程序UserContr…

LSM(日志结构合并树)_笔记

WAL&#xff1a;Write Ahead Log 写前日志&#xff0c;顺序日志文件 1 LSM tree的定义 LSM tree&#xff1a; Log-Structured-Merge-Tree&#xff0c;日志结构合并树。 Log-Structured Merge-tree (LSM-tree) is a disk-based data structure designed to provide low-cost …

Linux操作系统学习(了解文件系统动静态库)

文章目录浅谈文件系统了解EXT系列文件系统目录与inode的关系软硬链接动静态库浅谈文件系统 当我们创建一个文件时由两部分组成&#xff1a;文件内容文件属性&#xff0c;即使是空文件也有文件属性 一个文件没有被打开是存储在磁盘中的&#xff0c;而磁盘是计算机中的一个机械…

你想赚的钱不一定属于你

昨天一个同行跟我说&#xff0c;最近有个五十多万的订单&#xff0c;客户是拿着别人家的设计来找的他&#xff0c;跟了也有大半个月了&#xff0c;自己明明报的价格比原设计的公司要低&#xff0c;客户一直说会尽快下的&#xff0c;他原本想着能够从这个订单里赚到几万块&#…

王道计算机组成原理课代表 - 考研计算机 第六章 总线 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 计算机组成 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “总线” 章节知识点总结的十分全面&#xff0c;涵括了《计算机组成原理》课程里的…