当前位置: 首页 > news >正文

RPC通信原理(二)

RPC序列化

任何一种序列化框架,核心思想就是设计一种序列化协议,将对象的类型、属性类型、属性值一一按照固定的格式写到二进制字节流中来完成序列化,再按照固定的格式把数据一一读取出来,通过这些数据信息创建出一个新的对象,来完成反序列化。

public class Book implements Serializable {int id;String name;String title;String tag;String content;// 其他略
}

有哪些序列化框架

如何选择RPC序列化框架?

结论:首选Hessian和Protobuf,因为他们在性能、时间开销、空间开销、通用性、兼容性和安全性上,都满足了我们的要求

  • 安全性:首要考虑,如果序列化存在安全漏洞,那么线上的服务就很可能被入侵(JDK原生序列化存在漏洞)
  • 兼容性:序列化协议在版本升级后的兼容性是否很好,是否是跨平台、跨语言等
  • 通用性:能够对任意类型进行序列化和反序列化,不会出现服务接口方法加一个某种类型的参数之后服务突然调用方不能正常调用的情况
  • 性能、效率:序列化与反序列化过程是 RPC 调用的一个必须过程,性能和效率势必将直接关系到 RPC 框架整体的性能和效率
  • 空间开销:也就是序列化之后的二进制数据的体积大小。序列化后的字节数据体积越小,网络传输的数据量就越小,传输数据的速度也就越快,在RPC调用中直接关系到请求响应的耗时

使用RPC框架的时候需要注意:

  • 避免对象构造得过于复杂,属性很多,并且存在多层的嵌套
  • 避免对象过于庞大:大字符串,超大数组等
  • 避免使用序列化框架不支持得类型作为参数传递
  • 防止对象有复杂得继承关系
    • 子类进行序列化的时候会一步步往上把父类也序列化了
    • 如果父类中的某些字段不需要被序列化,可以使用transient关键字修饰这些字段,使其在序列化过程中被忽略。

小结

通信协议及操作系统的IO模型

在应用层常见的就是HTTP协议,对于HTTP协议来说也有不少优缺点:

  • 共有协议,通用,便于跨系统的通信
  • 各语言适配完善,解析库成熟,有利于构建异构系统
  • HTTP/1.1协议偏重,体积偏大,性能较低

HTTP/1.1是用AXCII码来表示的,内存占用还是较大

但是如果自研协议也有不少优缺点:

  • 协议私有,通信两端要一致
  • 需要自研协议的解析库
  • 可以做到协议精简,性能和安全性更高

网络IO其实就是计算机内存和外部设备之间拷贝数据的过程,对于单个进程是无法直接要到网卡的数据的,但是Linux kernel可以,在内核当中会存在一片内核缓冲区,内核会给上层提供一些列的系统接口来刷走这片数据。

操作系统中的IO模型:

  • 同步阻塞IO
  • 同步非阻塞IO
  • IO多路复用
  • 信号驱动IO
  • 异步IO

现在几乎都使用IO多路复用模型

小结

超时重试与时间轮算法

什么是超时重试?

当其中某个提供者服务挂掉了之后,直接把错误返回给用户是不太好的,所以会有一个兜底的策略,也就是超时重试,可以去向其他的提供者再一次发起请求。

如何检测请求是否超时?

  1. 客户端超时设置:客户端在发送RPC请求时可以设置一个超时时间,如果在规定时间内未收到响应,则认为请求超时。通常在客户端发送请求后会启动一个定时器来监控超时,一旦超时则可以进行相应的处理,比如重试或者返回错误信息。
  2. 服务端超时处理:服务端也可以设置处理请求的超时时间,如果服务端在规定时间内未能处理完请求并返回响应,可以直接返回超时错误给客户端。
  3. 中间件/代理层管理:在RPC框架中,通常会有中间件或代理层来管理请求的转发和响应,这些中间件可以负责监控请求和响应的超时情况,并进行相应处理。
  4. 统一超时管理:有些RPC框架会提供统一的超时管理机制,用于集中管理请求的超时设置和处理。通过这种机制,可以方便地对所有请求进行统一的超时处理,确保系统的稳定性。

我们把所有的超时请求全都集中管理起来,如下图所示:

那么,能否给出一种解决方案可以减少遍历的次数,提高效率呢?

时间轮算法

在时钟轮机制中,有时间槽,每个槽位代表一个时间,时间指针按照时间单位走动,将任务放到对应的时间槽位上,当时间指针走到改槽位的时候就可以拿出来执行。

小结

熔断、降级、限流

怎么判断需要进行熔断?

通过计算一段时间内服务的可用率/失败率

那么熔断工作什么时候开始的呢?又是什么时候结束的?

当可用率过低/失败率过高的时候会对服务进行熔断,熔断的时候会设置一个熔断时间,当超过熔断时间的时候系统会尝试调用一下这个服务,如果调用成功了,就可以结束熔断,反之继续熔断。

为什么有了熔断降级还需要限流?

在实际的生产环境当中,服务发生的一系列问题很大可能是由于高并发而引起的,这也就需要业务方要能够进行自我保护,从而保证在搞并发的情况下系统依然可以稳定运行。

限流的作用是用来限制其请求的速率,保护后台相应服务,以免服务过载导致服务不可用的现象出现。

常见的限流算法

令牌桶算法

我们会有一个生成令牌的工具去不断生成令牌,然后把令牌放入令牌桶当中,如果桶中的令牌用完了就不能再访问了,但是这个方法面临高并发的场景时就有可能只能把服务打挂掉。

漏斗算法

无论流量有多大,我一次只放一定量的请求进来,可以达到削峰的效果。

滑动窗口算法

限定在一定时间内我只接受多少请求,多了的不接收。

小结

相关文章:

RPC通信原理(二)

RPC序列化 任何一种序列化框架,核心思想就是设计一种序列化协议,将对象的类型、属性类型、属性值一一按照固定的格式写到二进制字节流中来完成序列化,再按照固定的格式把数据一一读取出来,通过这些数据信息创建出一个新的对象&…...

Redis 淘汰策略

Redis 是一个使用键值对存储数据的内存中数据结构存储系统,它支持多种类型的数据结构,如字符串(strings),列表(lists),集合(sets),有序集合&#…...

游戏数据处理

游戏行业关键数据指标 ~ 总激活码发放量、总激活量、总登录账号数 激活率、激活登录率 激活率 激活量 / 安装量 激活率 激活量 / 激活码发放量 激活且登录率 激活且登录量 / 激活码激活量 激活且登录率应用场景 激活且登录率是非常常用的转化率指标之一,广泛…...

Qt+FFmpeg+opengl从零制作视频播放器-14.程序Ubuntu移植

首先查看的是Linux系统的版本,我使用的是Ubuntu20.04.6LTS版本。 去Qt官网下载Qt 的版本。 这里下载的是5.12.12版本,双击运行,然后安装好Qt。 回想一下,在之前的程序,我们都是在Windows上开发,仅仅使用Qt和ffmpeg,Qt前面的步骤运行完成就可以安装好了,所以在linux上…...

Go 语言中的 Cond 机制详解

概述 在并发编程中,条件同步是一个常见的需求。Go 语言提供了 sync.Cond 类型来满足这一需求。sync.Cond 基于互斥锁(sync.Mutex)提供了条件变量的同步机制,允许一组 goroutine 在满足某个条件时进行阻塞等待,或者在条…...

如何使用vue定义组件之——子组件调用父组件数据

1.定义父子模板template <div class"container"><my-father></my-father><my-father></my-father><my-father></my-father><!-- 此处无法调用子组件&#xff0c;子组件必须依赖于父组件进行展示 --><!-- <my-…...

如何使用ArcGIS Pro生成带计曲线等高线

等高线作为常见的地图要素经常会被使用到&#xff0c;一般情况下生成的等高线是不带计曲线的&#xff0c;在某些情况下我们需要带计曲线的等高线&#xff0c;这里为大家介绍一下ArcGIS Pro生成带计曲线等高线的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数…...

蓝桥杯C++大学B组一个月冲刺记录2024/3/13

蓝桥杯C大学B组一个月冲刺记录2024/3/13 规则:每日三题 向日葵的花语是说不出的爱恋 不过今天有点水题了 1.有序分数 给定一个整数 N&#xff0c;请你求出所有分母小于或等于 N&#xff0c;大小在 [0,1] 范围内的最简分数&#xff0c;并按从小到大顺序依次输出。 这个题在被划…...

计算机网络——Internet结构和ISP

互联网结构&#xff1a;网络的网络 ISP&#xff1a;互联网服务提供商&#xff08;Internet Service Provider&#xff0c;ISP&#xff09;是指为用户提供互联网接入服务的组织或公司。ISP在互联网结构中扮演着关键的角色&#xff0c;它们通过建立网络基础设施和提供网络连接服…...

E.接龙数列【蓝桥杯】/动态规划

接龙数列 题目描述 对于一个长度为 K 的整数数列&#xff1a;A1, A2, . . . , AK&#xff0c;我们称之为接龙数列当且仅当 Ai 的首位数字恰好等于 Ai−1 的末位数字 (2 ≤ i ≤ K)。 例如 12, 23, 35, 56, 61, 11 是接龙数列&#xff1b;12, 23, 34, 56 不是接龙数列&#xf…...

cv2.cvtColor()将二维转化为彩色图像

我们如果要将一维的图像转化为三维的彩色图像 import cv2 img cv2.cvtColor(img.squeeze(0), cv2.COLOR_GRAY2BGR) 这里的img.squeeze为二维数据&#xff0c;img为三维数据&#xff0c;所以压缩掉一个维度 。这样就将图像转化为了三维彩色图像。 cv2.imshow(Image, img) c…...

为什么 VSCode 不用 Qt 而要用 Electron?

为什么 VSCode 不用 Qt 而要用 Electron? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Qt 的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&am…...

环信ChatroomUIKit功能详解——超详细介绍

聊天室是当下泛娱乐社交应用中最经典的玩法&#xff0c;通过调用环信的 IM SDK 接口&#xff0c;可以快速创建聊天室。如果想根据自己业务需求对聊天室应用的 UI界面、弹幕消息、礼物打赏系统等进行自定义设计&#xff0c;最高效的方式则是使用环信的 ChatroomUIKit 。 文档地址…...

怎么读取springboot中的properties.yml配置文件里的配置值(亲测有效)

怎么读取springboot中的properties.yml配置文件里的配置值 test:username: name主配置类中加上 EnableConfigurationProperties(MailConfigProperties.class)类上加ConfigurationPropetise("test“),属性就会自动注入配置值&#xff1b; ConfigurationPropetise("…...

18、设计模式之解释器模式(Interpreter)

一、什么是解释器模式 解释器模式是一种行为型设计模式。解释器模式就像是一种自定义语言&#xff0c;我们可以定义该语言的语法规则&#xff0c;然后从中解析出具体的命令或表达式&#xff0c;最终执行相应的操作。 eg&#xff1a;这种模式比较冷门&#xff0c;不怎么使用。 …...

cpp qt 一个奇怪的bug

今天在用cpp qt的时候发现了一个奇怪的东西 这是我的源代码 #include "mywidget.h" #include <QPushButton>myWidget::myWidget(QWidget *parent): QWidget(parent) {QPushButton * btn1 new QPushButton;btn1->show();btn1->setParent(this);btn1-&g…...

第6章:MATLAB文本数据处理进阶篇的目录 (MATLAB入门课程)

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 第6章&#xff1a;MATLAB文本数据处理进阶篇 6.1 文本格式化 …...

软件杯 深度学习 opencv python 公式识别(图像识别 机器视觉)

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的数学公式识别算法实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学…...

vscode通过多个跳板机连接目标机(两种方案亲测成功)

1、ProxyJump&#xff08;推荐使用&#xff09; 需要OpenSSH 7.3以上版本才可使用&#xff0c;可用下列命令查看&#xff1a; ssh -V ProxyJump命令行使用方法 ssh -J [email protected]:port1,[email protected]:port2 一层跳板机&#xff1a; ssh dst_usernamedst_ip -…...

C++基础复习003

vector去重 第一种&#xff0c;利用set容器的特性进行去重&#xff1a; #include <iostream> #include <vector> #include <set> using namespace std; int main() {vector<int>test{1,2,3,3,3,4,2,3,5,2,63,56,34,24};set<int>s(test.begin(),…...

天机学堂-分页查询

需求 分页查询我的课表 返回&#xff1a; 总条数、总页数、当前页的课表信息的集合 返回的VO&#xff08;已经封装成统一的LearningLessonsVO&#xff09; 定义Controller RestController RequestMapping("/lessons") RequiredArgsConstructor public class Lear…...

Ctrl+R 运行xxx.exe,发现有如下问题.

CtrlR 运行xxx.exe,发现有如下问题. (1)找不到Qt5Core.all,Qt5Cored.dll,Qt5Gui.dll,Qt5Guid.dll,Qt5Widgets.all,Qt5Widgetsd.dll? (2)之后找不到libwinpthread-1.dll 从这个目录拷贝相应的库到运行xx.exe目录下 方法二:将库路径添加到系统PATH环境变量里: 在Path中添加路…...

ADI硬件笔试面试题型解析下

本专栏预计更新60期左右。当前第17期-ADI硬件. ADI其硬件工程师岗位的招聘流程通常包括笔试和多轮技术面试,考察领域涵盖模拟电路设计、数字电路、半导体器件和信号处理等。 本文通过分析平台上的信息,汇总了ADI硬件工程师的典型笔试和面试题型,并提供详细解析和备考建议,…...

ES6——对象扩展之Set对象

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;Set 对象允许存储任何类型的唯一值&#xff0c;无论是原始值还是对象引用。Set 对象有一些有用的方法&#xff0c;可以操作集合中的数据。以下是一些常用的 Set 对象方法&#xff1a; 方法描述 add 向 Set 对象添加…...

网页前端开发(基础进阶4--axios)

Ajax Ajax(异步的JavaScript和XML) 。 XML是可扩展标记语言&#xff0c;本质上是一种数据格式&#xff0c;可以用来存储复杂的数据结构。 可以通过Ajax给服务器发送请求&#xff0c;并获取服务器响应的数据。 Ajax采用异步交互&#xff1a;可以在不重新加载整个页面的情况下&am…...

Deepseek/cherry studio中的Latex公式复制到word中

需要将Deepseek/cherry studio中公式复制到word中&#xff0c;但是deepseek输出Latex公式&#xff0c;比如以下Latex代码段&#xff0c;需要通过Mathtype翻译才能在word中编辑。 $$\begin{aligned}H_1(k1) & H_1(k) \frac{1}{A_1} \left( Q_1 u_1(k) Q_{i1} - Q_2 u_2(k…...

VR视频制作有哪些流程?

VR视频制作流程知识 VR视频制作&#xff0c;作为融合了创意与技术的复杂制作过程&#xff0c;涵盖从初步策划到最终呈现的多个环节。在这个过程中&#xff0c;我们可以结合众趣科技的产品&#xff0c;解析每一环节的实现与优化&#xff0c;揭示背后的奥秘。 VR视频制作有哪些…...

Ubuntu22.04 安装 Miniconda3

Conda 是一个开源的包管理系统和环境管理系统&#xff0c;可用于 Python 环境管理。 Miniconda 是一个轻量级的 Conda 发行版。Miniconda 包含了 Conda、Python和一些基本包&#xff0c;是 Anaconda 的精简版本。 1.下载安装脚本 在 conda官网 找到需要的安装版本&#xff0…...

【React】useId

在 React 中&#xff0c;useId 是 React 18 引入的一个 Hook&#xff0c;用于生成一个在组件生命周期中保持稳定的唯一 ID。它主要用于&#xff1a; 无障碍&#xff08;accessibility&#xff09;场景&#xff0c;比如表单控件需要一个 id 和 label 的 htmlFor 属性配对。服务…...

MCP协议重构AI Agent生态:万能插槽如何终结工具孤岛?

前言 在人工智能技术快速发展的2025年&#xff0c;MCP(Model Context Protocol&#xff0c;模型上下文协议)正逐渐成为AI Agent生态系统的关键基础设施。这一由Anthropic主导的开放协议&#xff0c;旨在解决AI模型与外部工具和数据源之间的连接难题&#xff0c;被业界形象地称…...