【青训营】RPC框架分层设计简述

news2024/11/15 19:34:09

远程函数调用,Remote Procedute Calls,简称RPC。RPC需要解决的问题有:完成远程函数的映射,并且将数据转化为字节流,使用网络进行传输

RPC基本概念

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

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

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

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

RPC的好处在于:

  • 函数职责单一,有利于分工协作和运维开发
  • 可扩展性强,可以独立扩充资源,资源使用率更优秀
  • 故障隔离,单个服务故障不影响整体,服务的整体可用性更高

但是RPC也带来一定的挑战:

  • 如果调用的函数所属的服务宕机应该如何处理
  • 调用过程中网络异常,如何保证消息可达
  • 请求量突增导致服务无法及时处理,如何应对

这些问题一般由RPC框架来解决

分层设计

以Apache Thrift为例子

image.png

编解码层

客户端和服务端通过同一份IDL文件生成不同的语言

image.png

其中IDL可采用的文件数据格式有:

  • 语言特定格式:许多编程语言都内建了将内存对象编码为字节序列的支持,比如Java的java.io.Serializable序列化格式。缺点是和语言深度绑定了
  • 文本格式:JSON\XML\CSV等,具有人类可读性,但是描述不够严谨,而且缺乏模型约束,只能采用文档约束
  • 二进制编码:具有跨语言和高性能等优点,比如说Thrift的BinaryProtocal等

以BinaryProtocal为例,他的实现是TLV(Tag-Length-Value)编码,其IDL中的示例如下:

image.png
我们可以看到该结构体中的第一行属性,string是它的类型,1是他的编号

那么一个Person(“Martin”,1337,[“daydreaming”, “hacking”])的实例在编码后的字节流如下:

image.png
我们可以看到,前4个字节表示的是userName的类型,为string,二进制编码为0b,因为在TLV中11表示string。接下来8个字节为field tag,指明是哪个属性,其中值为00 01,表示1号tag,也就是username;接下来的16字节表示该属性的长度,“Martin”总共6个字符因此长度为6;后面跟着的24字节为“Martin”的ASCII码表示。

第二个favoriteNumber的类型为INT64,长度已经固定,因此不需要指出length。

编码层的选型需要考虑以下因素:

  • 兼容性:支持新增字段但不影响老得服务
  • 通用性:跨平台跨语言
  • 性能:从空间和时间两个维度来考虑

协议层

Thrift协议层通用协议格式:

image.png

网络通信层

主要是用SocketAPI进行通信,其中SocketAPI位于应用层和传输层之间

image.png

其中SocketAPI执行流程如下
image.png
一般开发的时候,一般使用网络库来操作,用于提供易用的API,支持多种协议,并且要求有优异的性能

RPC框架关键指标

稳定性

熔断:保护调用方,防止被调用的服务出现问题而影响整个链路

限流:保护被调用方,防止大流量把服务压垮

超时控制:避免浪费资源在不可用的结点上

另外还有一个很重要的指标:请求成功率
提高成功率的办法:负载均衡和重试

另外需要注意的问题是长尾请求,指的是响应时间明显长于平均的请求,也就是响应时间超过99%的其他请求的请求。

解决长尾请求的方法是响应备份Backup Request。如右图,发送第一次请求后,在t3时间内没有收到请求的时候发送备份请求Request2。t3的值是前99%请求的响应时间。
image.png

增加稳定性的手段,比如超时、熔断等,主要是通过注册中间件来实现

image.png

易用性

易用性主要特点是:

  • 开箱即用:提供合理的默认参数选项、丰富的文档
  • 丰富的周边工具:比如提供生成代码工具、脚手架工具

扩展性

能够提供足够多的扩展点,比如:

  • 中间件
  • Option
  • 编解码层和协议层的扩展
  • 支持扩展代码生成工具
  • 支持自行添加更多的网络传输层协议

image.png

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

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

相关文章

OpenCV 图像梯度算子

本文是OpenCV图像视觉入门之路的第12篇文章,本文详细的介绍了图像梯度算子的各种操作,例如:Sobel算子Scharr算子laplacian算子等操作。 OpenCV 图像梯度算子目录 1 Sobel算子 2 Scharr算子 3 laplacian算子 1 Sobel算子 Sobel算子是一种图…

.Net Core对于`RabbitMQ`封装分布式事件总线

首先我们需要了解到分布式事件总线是什么;分布式事件总线是一种在分布式系统中提供事件通知、订阅和发布机制的技术。它允许多个组件或微服务之间的协作和通信,而无需直接耦合或了解彼此的实现细节。通过事件总线,组件或微服务可以通过发布或…

基于STM32的虚拟示波器

仓库地址 https://github.com/shuai132/ScopeMCU ScopeMCU Oscilloscope for MCU MCU: STM32F103C8Tx 需配合ScopeGUI使用 截图说明见wiki 最新版Releases Introduction 用最少的硬件成本,做一个实用的虚拟示波器。 这是硬件部分,基于STM32最小…

提取DataFrame中每一行的DataFrame.itertuples()方法

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】提取DataFrame中的每一行DataFrame.itertuples()选择题关于以下python代码说法错误的一项是?import pandas as pddf pd.DataFrame({A:[a1,a2],B:[b1,b2]},index[i1,i2])print("【显示】d…

基于SpringBoot实现ChatGPT-QQ机器人

概述 近期ChatGPT火爆全球,在其官方网站上也列举了非常全面的应用案例,仅仅上线两个月活跃用户数已经达到1亿,成为历史上用户数增长最快的面向消费者的应用 快速体验 OpenAI官网对外提供了标准的 API 接口,可以通过HTTP请求进行…

SignalR注册成Windows后台服务,并实现web前端断线重连

注意下文里面的 SignalR 不是 Core 版本,而是 Framework 下的 本文使用的方式是把 SignalR 写在控制台项目里,再用 Topshelf 注册成 Windows 服务 这样做有两点好处 传统 Window 服务项目调试时需要“附加到进程”,开发体验比较差&#xf…

RibbitMQ 入门到应用 ( 二 ) 安装

3.安装基本操作 3.1.下载安装 3.1.1.官网 下载地址 https://rabbitmq.com/download.html 与Erlang语言对应版本 https://rabbitmq.com/which-erlang.html 3.1.2.安装 Erlang 在确定了RabbitMQ版本号后,先下载安装Erlang环境 Erlang下载链接 https://packa…

vue通用后台管理系统

用到的js库 遇到的问题 vuex和 localStorage区别 vuex在内存中,localStorage存在本地localStorage只能存储字符串类型数据,存储对象需要JSON.stringify() 和 parse()…读取内存比读取硬盘速度要快刷新页面vuex数据丢失,localStorage不会vuex…

图的基本介绍和表示方式

图的基本介绍 为什么要有图这个基本数据结构? 我们还学习过线性表(数组、队列、链表和栈)和树,但是我们可以发现,线性表局限于一个直接前驱(就是只能有唯一一个前面的结点)和一个直接后继的(…

Python+dilb 简单实现人脸检测(附代码)

如果dilb和face_recognition第三方包安装失败,请移步到Python 解决dilb和face_recognition第三方包安装失败_水w的博客-CSDN博客 目录 一、环境配置 二、前期知识 1 读取图片 2 灰度转换 解决报错cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\o…

【前端vue2面试题】2023前端最新版vue模块,高频17问(上)

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:博主收集的关于vue2面试题(上) 目录 vue2面试题 1、$route 和 $router的区别 2、一个…

【Spark分布式内存计算框架——Spark Core】9. Spark 内核调度(上)

第八章 Spark 内核调度 Spark的核心是根据RDD来实现的,Spark Scheduler则为Spark核心实现的重要一环,其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据,根据RDD的依赖关系构建DAG,基于DAG划分Stag…

PVE虚拟机篇-PVE虚拟机安装

安装包下载 前往Proxmox Virtual Environment下载ISO镜像文件,可以直接选择最新版本。 但是如果没有海外线路一般下载十分缓慢,甚至下不动,所以可以去中科大镜像源:中科大Proxmox Virtual Environment 制作U盘启动盘 可以使用…

SpringMVC:拦截器(12)

拦截器1. 拦截器概念2. 拦截器入门案例2.1 环境准备2.2 拦截器开发步骤1: 创建拦截器类步骤2: 配置拦截器类步骤3: SpringMVC添加SpringMvcSupport包扫描和interceptor包扫描步骤4: 简化SpringMvcSupport的编写5 测试3. 拦截器参数解析(了解)3.1 前置处理…

字节一面:在浏览器地址栏输入一个 URL 后回车,背后发生了什么?

近段时间,有小伙伴面试字节,说遇到一个面试题: 在浏览器地址栏输入一个 URL 后回车,背后发生了什么? 这里尼恩给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”&#xf…

c# 自定义隐式转换与运算符重载

用户定义的显式和隐式转换运算符 参考代码 用户定义的显式和隐式转换运算符 - 提供对不同类型的转换 | Microsoft Learn 代码例程 using System;public readonly struct Digit {private readonly byte digit;public Digit(byte digit){if (digit > 9){throw new Argumen…

电子科技大学操作系统期末复习笔记(一):操作系统概述

目录 前言 操作系统概述 操作系统的目标与功能 操作系统的定义 目标 功能 操作系统的历史 单用户系统 简单批处理系统 多道批处理系统 分时系统 个人电脑 → 分布式系统 → 互联网时代 → 移动计算时代 → ...... 实时系统 操作系统的基本特征 并发 共享 虚拟…

第一章 PDF语法

第一章 PDF语法PDF ObjectsNull ObjectsBoolean ObjectsNumeric ObjectsName ObjectsString ObjectsArray ObjectsDictionary ObjectsName treesNumber treesStream ObjectsDirect versus Indirect ObjectsFile StructureWhite-SpaceThe Four Sections of a PDFHeaderTrailerBo…

Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)

文章目录1. Sa-Token 介绍2. 登录认证2.1 登录与注销2.2 会话查询2.3 Token 查询3. 权限认证3.1 获取当前账号权限码集合3.2 权限校验3.3 角色校验4. 前后台分离(无Cookie模式)5. Sa-Token 集成 Redis6. SpringBoot 集成 Sa-Token6.1 创建项目6.2 添加依…

Python 高级编程之网络编程 Socket(六)

文章目录一、概述二、Python socket 模块1)Socket 类型1、创建 TCP Socket2、创建 UDP Socket2)Socket 函数1、服务端socket函数2、客户端socket函数3、公共socket函数三、单工,半双工以及全双工通信方式的区别四、单工,半双工以及…