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框架会提供统一的超时管理机制,用于集中管理请求的超时设置和处理。通过这种机制,可以方便地对所有请求进行统一的超时处理,确保系统的稳定性。

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

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

时间轮算法

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

小结

熔断、降级、限流

怎么判断需要进行熔断?

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

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

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

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

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

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

常见的限流算法

令牌桶算法

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

漏斗算法

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

滑动窗口算法

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

小结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-链表(一)

一、链表简介 链表(Linked List)是一种常见的数据结构,用于存储和组织数据。与数组不同,链表的元素(节点)在内存中不必连续存储,而是通过指针链接在一起。 链表由多个节点组成,每个…

基于最小二乘递推算法的系统参数辨识matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于最小二乘递推算法的系统参数辨识。对系统的参数a1,b1,a2,b2分别进行估计,计算估计误差以及估计收敛曲线&#…

Mock.js 基本语法与应用笔记

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

SingleSpa微前端基本使用以及原理

先说说singleSpa的缺点 不够灵活 不能动态加载css文件css不隔离没有js沙箱的机制 ( 没有全局对象 每次切换的应用 都是同一个window ) 但是刚刚接触微前端 可以了解一下微前端的基础使用 qiankun微前端框架已经很成熟 也是基于singleSpa来实现的 点击跳转qiankun的基础使用 大…

【Vuforia+Unity】一个简单AR识别图像弹出按钮播放暂停视频

场景搭建 2.按钮播放视频这部分写一个按钮回调函数即可 3.控制视频的代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Video;public class videomanager : MonoBehaviour {// 这个脚本实现按钮控制VIDEO播放GameO…

snakeflow的springboot项目

Gitee搜索“liuxz/snakerflow”,它是spring boot集成了一款国产工作流引擎snakerflow。 下面是安装步骤: 创建数据库snaker-web,字符集设置成utf8mb4和utf8mb4_generic。不然的话,中文插入不进去。 运行sql命令 CREATE TABLE …

算法刷题day29:区间合并

目录 引言概念一、挤牛奶二、区间合并三、校门外的树四、管道 引言 区间合并这种题,是比较小的题,一般是不会直接出成一道题来考你的,一般思路都是给一道题,里面包含了各种的点,每一个点都需要一个想区间合并这样的知…

【代表作神刊】经管社科类,稀缺SSCI2区期刊,仅14天见刊,2天检索!!

2024年3月第二周,我处EA-ISET协会推荐发表的文章目前都在有序进行中, 新增检索5篇,SSCI5篇; 新增见刊10篇,SSCI1篇,CNKI5篇,谷歌普刊4篇; 现整理部分录用案例,时间节点…

新书速览|机器学习实战:视频教学版

掌握线性回归、分类、数据降维、聚类、关联规则、协同过滤算法及应用 本书内容 《机器学习实战:视频教学版》基于Python语言详细讲解机器学习算法及其应用,用于读者快速入门机器学习。本书配套示例源代码、PPT课件、教学视频、教学大纲、习题与答案、作者…

Voip测试工具

SIPp是一个测试SIP协议性能的工具软件。这是一个GPL的开放源码软件。 sipp是安装在linux机器上的 SIPp可以用来测试许多真实的SIP设备,如SIP代理,B2BUAs,SIP媒体服务器,SIP/x网关,SIP PBX,等等,它也可以模…

for、while、do...while循环的使用

本篇文章只记录for、while、do...while循环的使用&#xff0c;由于java循环较为简单&#xff0c;所以直接上代码。 1、for循环 需求&#xff1a;循环遍历求和 1-100。 public class Demo {public static void main(String[] args) {int sum 0;for (int i 1; i < 100; i…

技术驱动校园招聘:Java+SpringBoot+Vue的实践之旅

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Linux——线程(2)

在上一篇博客中我介绍了Linux中的线程是什么样的&#xff0c;就如同进程可以通过 fork创建&#xff0c;可以被终止&#xff0c;可以退出一样&#xff0c;线程也可以被我们用户控制&#xff0c;这 篇博客我会介绍线程的控制&#xff0c;并且基于线程的控制所产生的一些问题进行 …

麒麟信安集控云工作站解决方案,驱动电网奔向数字化转型新未来!

集控站是电网运行信息的集中监控中心&#xff0c;实现对电网设备状态感知、缺陷发现、主动预警、风险管控和应急处置的全流程闭环管控&#xff0c;在保障日常供电方面发挥重要作用。此前集控站主要采用网络KVM矩阵&#xff0c;其数字化转型面临延长距离受限、无法实现跨辖区延伸…

Redis及其常用命令(二)

SortedSet类型 在此类型中&#xff0c;每个元素都有一个分数 key -> string value -> sorted([socre,member],[score,member]...) # 添加元素 zadd key score member # 遍历集合 zrange key start stop [withscores] #升序 zrevrange key start stop [withscores]#降序…

二、vue-cli项目搭建

系列文章&#xff1a; vue实战&#xff08;商城后台管理系统&#xff09;&#xff1a;http://t.csdnimg.cn/f6Fqa vue.js :http://t.csdnimg.cn/mljxv 目录 系列文章&#xff1a; vue实战&#xff08;商城后台管理系统&#xff09;&#xff1a;http://t.csdnimg.cn/f6Fqa vue…

O2OA(翱途)流程引擎中如何修改,定制流程的流转记录

使用场景 在特殊使用场景中需要定制流转记录,比如业务上需要修改用户名称,修改时间和意见等. 比如一下场景: 需要将用户"b(company01)"的流转记录修改为"d(company01)". 手工修改 系统默认提供维护工具,在有权限的情况下可以直接进行维护. 通过"左…

AI壁纸号一周增加上千粉丝,轻松变现的成功案例分享

前言 随着AI绘画技术的发展&#xff0c;传统的互联网副业壁纸号在新的技术加持下迎来了第二春。本文将分享一位壁纸号创作者的成功案例&#xff0c;并为大家提供创作门槛和硬件要求等相关信息。 该项目的创作门槛极低&#xff0c;基本上可以由AI完成内容创作。不过&#xff0…

“我快无聊死了”用英语怎么说?柯桥英语口语学习,成人零基础学外语

每日一句 Im bored to death. 我快无聊死了。 单词解析&#xff1a; bored / bɔːd / adj.无聊的&#xff0c;厌倦的 bored to d15857575376eath&#xff1a;指非常无聊或厌烦&#xff0c;达到了极点的程度。 "bored" 和 "boring" 都与无聊相关&#…

Python编程从入门到实践中的一些误区

1.num 使用num时python报错&#xff0c;后来查过后才知道是因为python不支持自增或自减&#xff0c;可以用1。 2.字符串和非字符串连接 要先将非字符串转换为字符串类型之后才能连接 print&#xff08;2int&#xff08;‘2’&#xff09;&#xff09;#4 3.关键字参数必须在未…