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多路复用模型
小结

超时重试与时间轮算法
什么是超时重试?

当其中某个提供者服务挂掉了之后,直接把错误返回给用户是不太好的,所以会有一个兜底的策略,也就是超时重试,可以去向其他的提供者再一次发起请求。
如何检测请求是否超时?
- 客户端超时设置:客户端在发送RPC请求时可以设置一个超时时间,如果在规定时间内未收到响应,则认为请求超时。通常在客户端发送请求后会启动一个定时器来监控超时,一旦超时则可以进行相应的处理,比如重试或者返回错误信息。
- 服务端超时处理:服务端也可以设置处理请求的超时时间,如果服务端在规定时间内未能处理完请求并返回响应,可以直接返回超时错误给客户端。
- 中间件/代理层管理:在RPC框架中,通常会有中间件或代理层来管理请求的转发和响应,这些中间件可以负责监控请求和响应的超时情况,并进行相应处理。
- 统一超时管理:有些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><!-- 此处无法调用子组件,子组件必须依赖于父组件进行展示 --><!-- <my-…...
如何使用ArcGIS Pro生成带计曲线等高线
等高线作为常见的地图要素经常会被使用到,一般情况下生成的等高线是不带计曲线的,在某些情况下我们需要带计曲线的等高线,这里为大家介绍一下ArcGIS Pro生成带计曲线等高线的方法,希望能对你有所帮助。 数据来源 教程所使用的数…...
蓝桥杯C++大学B组一个月冲刺记录2024/3/13
蓝桥杯C大学B组一个月冲刺记录2024/3/13 规则:每日三题 向日葵的花语是说不出的爱恋 不过今天有点水题了 1.有序分数 给定一个整数 N,请你求出所有分母小于或等于 N,大小在 [0,1] 范围内的最简分数,并按从小到大顺序依次输出。 这个题在被划…...
计算机网络——Internet结构和ISP
互联网结构:网络的网络 ISP:互联网服务提供商(Internet Service Provider,ISP)是指为用户提供互联网接入服务的组织或公司。ISP在互联网结构中扮演着关键的角色,它们通过建立网络基础设施和提供网络连接服…...
E.接龙数列【蓝桥杯】/动态规划
接龙数列 题目描述 对于一个长度为 K 的整数数列:A1, A2, . . . , AK,我们称之为接龙数列当且仅当 Ai 的首位数字恰好等于 Ai−1 的末位数字 (2 ≤ i ≤ K)。 例如 12, 23, 35, 56, 61, 11 是接龙数列;12, 23, 34, 56 不是接龙数列…...
cv2.cvtColor()将二维转化为彩色图像
我们如果要将一维的图像转化为三维的彩色图像 import cv2 img cv2.cvtColor(img.squeeze(0), cv2.COLOR_GRAY2BGR) 这里的img.squeeze为二维数据,img为三维数据,所以压缩掉一个维度 。这样就将图像转化为了三维彩色图像。 cv2.imshow(Image, img) c…...
为什么 VSCode 不用 Qt 而要用 Electron?
为什么 VSCode 不用 Qt 而要用 Electron? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Qt 的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!&am…...
环信ChatroomUIKit功能详解——超详细介绍
聊天室是当下泛娱乐社交应用中最经典的玩法,通过调用环信的 IM SDK 接口,可以快速创建聊天室。如果想根据自己业务需求对聊天室应用的 UI界面、弹幕消息、礼物打赏系统等进行自定义设计,最高效的方式则是使用环信的 ChatroomUIKit 。 文档地址…...
怎么读取springboot中的properties.yml配置文件里的配置值(亲测有效)
怎么读取springboot中的properties.yml配置文件里的配置值 test:username: name主配置类中加上 EnableConfigurationProperties(MailConfigProperties.class)类上加ConfigurationPropetise("test“),属性就会自动注入配置值; ConfigurationPropetise("…...
18、设计模式之解释器模式(Interpreter)
一、什么是解释器模式 解释器模式是一种行为型设计模式。解释器模式就像是一种自定义语言,我们可以定义该语言的语法规则,然后从中解析出具体的命令或表达式,最终执行相应的操作。 eg:这种模式比较冷门,不怎么使用。 …...
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入门课程)
讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。 MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 第6章:MATLAB文本数据处理进阶篇 6.1 文本格式化 …...
软件杯 深度学习 opencv python 公式识别(图像识别 机器视觉)
文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的数学公式识别算法实现 该项目较为新颖,适合作为竞赛课题方向,学…...
vscode通过多个跳板机连接目标机(两种方案亲测成功)
1、ProxyJump(推荐使用) 需要OpenSSH 7.3以上版本才可使用,可用下列命令查看: ssh -V ProxyJump命令行使用方法 ssh -J [email protected]:port1,[email protected]:port2 一层跳板机: ssh dst_usernamedst_ip -…...
C++基础复习003
vector去重 第一种,利用set容器的特性进行去重: #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(),…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
