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(),…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
