中间件复习之-RPC框架
什么是RPC框架?
RPC(Remote Procedure Call):远程过程调用。当多个应用部署在多个服务器上时,由于他们不在一个内存空间上,因此需要网络来进行通信,而RPC允许它像调用本地方法一样调用远程服务。
RPC原理
服务消费方通过RPC客户端调用服务,服务接收方通过RPC服务端接收请求进行处理。
整体分四个模块:
- 远程代理
- 序列化
- 网络传输
- 反序列化
RPC核心功能实现
RPC服务消费方
- 连接管理
- 负载均衡
- 请求路由
- 超时处理
- 健康检查
连接管理
消费方需要保持与服务方的长链接,用于传输请求也用于返回结果。那该如何实现呢?
下面是连接管理在整个服务消费调用过程中的位置:
连接管理核心有以下3个需要思考的点:
- 连接初始化的时机:灵活根据业务场景选择策略
- 懒加载:服务刚启动的时候不初始化,等有请求调用时再初始化连接。建好后再次有请求就复用这个连接。(网关场景一般使用懒加载。因为网关业务是公司所有流量的入口,下游服务可能有n个服务*n个节点。一个网关服务启动后,如果要等全部连接建立完毕之后启动会很慢,并且如果有模块没什么流量还占用着连接会有资源的浪费。一般网关服务上线后先分配少点的流量然后再预热,预热完后开放。)
- 预加载:模块启动后先不接流量,把所有的连接、socket全部建好了然后再提供服务。(一般普通应用服务都是这种模式)
- 连接数的维护:多建几条连接防止单条连接失效。
- 心跳/重连:多条连接有探活机制,保证有多条连接可用。
负载均衡
负载均衡功能是确保多个服务提供方节点流量均匀/合理,支持节点扩容与灰度发布。
负载均衡在消费方rpc调用的位置:
负载均衡的一些方式:轮询、随机、取模、带权重、一致性Hash
请求路由
当业务方想按照某些请求标签来确定是不是要走该节点时,可以使用请求路由。通过一系列规则过滤出可以选择的服务提供方节点列表,在应用隔离,读写分离,灰度发布中都发挥作用。
请求路由在消费方调用过程中的位置:
请求路由功能的设计:
- 规则匹配:
- 待比较的属性(IP/流量标签)
- 运算符(等于、大于、不等于等等)
- 属性匹配值(跟哪个值进行匹配)
- 匹配完的结果(行为)
- 数据结构设计:因为是一系列规则,所以可以是链表结构
如按照IP分流规则举例:attribute=IP,operator=IN,value=IP1,IP2,Servers:Node1,Node2
超时处理
消费端对于长时间没有返回的请求,需要作出异常处理,及时释放资源。
超时处理在RPC调用链路中的位置:
超时处理的核心逻辑:
-
工作线程的阻塞位置
- 等待服务端回包通知(接收到请求了,判断是否超时)如下图:
-
超时逻辑
- 工作线程等待回包通知
- 如果数据在预期的时间内返回,则终止等待唤醒工作线程
- 如果超时则抛出异常
-
超时处理的核心数据结构
- Map:SessionID(请求级唯一)-WindowData(内部包含Event)
RPC服务提供方
- 队列/线程池
- 超时丢弃
- 优雅关闭
- 过载保护
队列/线程池
服务提供方可以将不同类型的请求,放入各自的队列,每个队列分配独立的线程池,做到资源隔离。
队列/线程池在服务提供方处理逻辑中的位置:
队列数/线程数的选择可以按照实际压测后的情况去调整。
超时丢弃
超时丢弃主要是将已经超时(超时的定义主要是调用方配置的超时时间)的请求快速失败,缓解队列堆积,防止服务持续不可用。
超时丢弃在服务提供方处理逻辑中的位置:
超时丢弃的处理逻辑:
io任务入队,任务包含3个字段,第一个是超时时间,第二个是处理请求的handler处理器,第三个是入队时间。
下面是出队以及判定超时的逻辑:
优雅关闭
优雅关闭主要是进程退出前确保接收到的请求全部处理完成
优雅关闭的实现:通过2种方式通知调用方
- 返回数据中带关闭信息
- 发送关闭协议通知调用方
优雅关闭的服务端实现
- 监听关闭信号 kill -12
- 改变服务状态
- 通知客户端
监听关闭信号 kill -12
服务启动时候,使用Signal注册监听
改变服务状态
修改服务上下文的状态
通知客户端本服务端已关闭
优雅关闭的客户端实现
-
根据节点返回内容改变节点状态
-
节点探活
过载保护
服务提供方为保证正常运行,主动丢弃超出处理能力外的请求。
过载保护在调用链路下的位置:
过载保护的实现原理:IO线程任务入队时判断是否设置了队列长度限制,若有限制,则和队列中实际任务数做比较,若超出则丢弃。
RPC高级功能
- 服务熔断
- 服务降级
- 限流
- 动态权重
服务熔断
当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。
服务降级
对业务降级,跳过异常调用,返回关键数据,确保服务可用。(一般是熔断时结合降级,返回default数据,使业务不中断)
动态权重
为刚启动节点分配较低权重,逐步提高权重。
限流
通过限制调用放流量,以达到对服务提供方的保护。
相关文章:
中间件复习之-RPC框架
什么是RPC框架? RPC(Remote Procedure Call):远程过程调用。当多个应用部署在多个服务器上时,由于他们不在一个内存空间上,因此需要网络来进行通信,而RPC允许它像调用本地方法一样调用远程服务。 RPC原理 服务消费方通过RPC客户…...
AcWing 787. 归并排序——算法基础课题解
AcWing 787. 归并排序 文章目录 题目描述CGo模板 题目描述 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n。 第二行包含 n 个整数(所有…...
力扣1379---找出克隆二叉树的相同节点(Java、DFS、简单题)
目录 题目描述: 思路描述: 代码: (1): (2): 题目描述: 给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 ori…...
FLink学习(三)-DataStream
一、DataStream 1,支持序列化的类型有 基本类型,即 String、Long、Integer、Boolean、Array复合类型:Tuples、POJOs 和 Scala case classes Tuples Flink 自带有 Tuple0 到 Tuple25 类型 Tuple2<String, Integer> person Tuple2.…...
Failed to resolve import “Home/components/HomeNew.vue“. Does the file exist?
错误信息 [plugin:vite:import-analysis] Failed to resolve import "/apis/home.js" from "src/views/Home/components/HomeNew.vue". Does the file exist? 错误原因 路径错误 解决方法...
《价值》-张磊-高瓴资本-3-建立人脉和信任;顺应趋势,把握机遇;
第三章 价值投资初试炼 2005.6.1 创办高瓴资本 许多人问我为什么一直在创业,其实我倒没想到自己非要创业成功不可,只是觉得一定要做点事,做点有意义的事。归根到底,可能是“爱折腾,不满足现状,爱挑战自己”…...
游戏引擎中的物理应用
一、 角色控制器 Character Controller和普通的动态对象(Dynamic Actor )是不同的,主要的三个特点是: 它拥有可控制的刚体间的交互假设它是有无穷的摩擦力(可以站停在位置上),没有弹性加速和刹车几乎立即…...
复现k8s黄金票据学习
1.什么是黄金票据 在 Kubernetes 中,"黄金票据"并不是一个常见的术语。可能你想了解的是服务账户(Service Account)。服务账户是 Kubernetes 中用于身份验证和授权的一种机制。它们允许 Pods 或其他工作负载在 Kubernetes 集群中与…...
08-JavaScript BOM定时器及JS动画
1. 设置定时器 1.1设置超时定时器 超时调用需要使用window对象的setTimeout()方法,该方法接受两个参数:调用函数或计算表达式和以毫秒为单位的时间(即在执行代码前需要等待多少毫秒)。 //setTimeout(callback, after) //callba…...
边缘计算盒子与云计算:谁更适合您的业务需求?
边缘计算盒子和云计算,这两个概念听起来可能有点复杂,但其实它们就是两种不同的数据处理方式。那谁更适合您的业务需求呢?咱们来详细说说。 边缘计算盒子,就像是个小型的数据处理中心,放在离你业务现场比较近的地方。它…...
浅聊什么是Redis?
需求:MySQL面临大量的查询,即读写操作,因此类比CPU,给数据加缓存,Redis诞生。应用程序从MySQL查询的数据,在Redis设置缓存(记录在内存中,无需IO操作),后再需要…...
java算法day43 | ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
1049. 最后一块石头的重量 II 核心思想: 尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 是不是感觉和昨天讲解的416. 分割等和子集 (opens new window)非常像了。那么分成两堆石头,一堆石头的…...
练气第六天
问:ANR怎么分析? ANR问题,这其实是一个非常综合性的问题,因为anr会涉及CPU负载,内存空间大小,线程锁,GC回收,这里面每个点,都是非常考验我们基本功的。 分析ANR问题,需…...
认识 Redis 与 分布式
Redis 官网页面 Redis官网链接 Redis 的简介 Redis 是一个在内存中存储数据的中间件 一方面用于作为数据库,另一方面用于作为数据缓存,适用于分布式系统中 Redis 基于网络,进行进程间通信,把自己内存中的变量给别的进程…...
Linux初学(十二)AWK进阶
一、AWK 1.1 简介 AWK是Linux中重要的文本处理工具Linux三剑客只一处理的对象可以是一个具体的文件,也可以是一个命令的执行结果AWK按行读取文件,将每一行视为一条记录 案例一:获取系统中每个用户的uid 方法一:cat /etc/passwd |…...
文字识别 Optical Character Recognition,OCR CTC STN
文字识别 Optical Character Recognition,OCR 自然场景文本检测识别技术综述 将图片上的文字内容,智能识别成为可编辑的文本。 场景文字识别(Scene Text Recognition,STR) OCR(Optical Character Recognition, 光学字符识别)传统上指对输入扫描文档图像进行分析处理,识…...
四、MySQL读写分离之MyCAT
一、读写分离概述 1、什么是读写分离: 读写分离:就是将读写操作分发到不同的服务器,读操作分发到对应的服务器 (slave),写操作分发到对应的服务器(master) ① M-S (主从) 架构下&…...
通讯录项目实现
引言:通过顺序表的逻辑实现通讯录。这里就不讲关于顺序表的函数了。如果有不明白的可以看我写的顺序表的博客。 目录 顺序表与通讯录的比较 各源文件文件大榄 Contact.c中通讯录相关函数的定义 初始化和销毁通讯录 添加联系人: 删除联系人…...
xss相关知识点与绕过思路总结
前言 对xss的绕过进行了系统的学习与实践后,重新审视一下xss,对他的绕过进行一个总结。 (当然我也是个小白,这些也是我当时瞎鸡儿乱搞绕过了几个xss自己做的小总结) 可能有点丑陋,献丑了。 好博客推荐 …...
深入解析语言模型:原理、实战与评估
引言 随着人工智能的飞速发展,语言模型作为自然语言处理(NLP)的核心技术之一,日益受到业界的广泛关注。本文旨在深入探讨语言模型的原理、实战应用以及评估方法,帮助读者更好地理解和应用这一技术。 一、语言模型原理…...
Elasticsearch 的索引优化常规项
优化常规项 https://blog.csdn.net/bairo007/article/details/132019575 1、按实际情况适当调整主分片的数量 如果主分片数量太少,会导致每个分片中的数据量过大,而且无法利用集群中所有节点的计算资源。如果主分片数量太多,会导致索引过度…...
【JavaParser笔记01】JavaParser解析Java源代码中的类信息(javadoc注释、类名称)
这篇文章,主要介绍如何使用JavaParser解析Java源代码中的类信息(javadoc注释、类名称)。 目录 一、JavaParser依赖库 1.1、引入依赖 1.2、获取类注释信息...
Stable Diffusion扩散模型【详解】小白也能看懂!!
文章目录 1、Diffusion的整体过程2、加噪过程2.1 加噪的具体细节2.2 加噪过程的公式推导 3、去噪过程3.1 图像概率分布 4、损失函数5、 伪代码过程 此文涉及公式推导,需要参考这篇文章: Stable Diffusion扩散模型推导公式的基础知识 1、Diffusion的整体…...
关于rabbitmq的prefetch机制
消息预取机制(Prefetch Mechanism)是RabbitMQ中用于控制消息传递给消费者的一种机制。它定义了在一个信道上,消费者允许的最大未确认的消息数量。一旦未确认的消息数量达到了设置的预取值,RabbitMQ就会停止向该消费者发送更多消息…...
机器学习介绍
机器学习是人工智能(AI)的一个分支,它使计算机系统能够从数据中学习并改进它们的性能。机器学习的核心在于开发算法,这些算法可以从大量数据中识别模式和特征,并用这些信息来做出预测或决策,而无需进行明确…...
OpenCV4.9开发之Window开发环境搭建
1.打开OpenCV所在github地址 2.点击opencv仓库,进入仓库详情,点击右下方的OpenCV 4.9.0进入下载页面 3.点击opencv-4.9.0-windows.exe下载 开始下载中... 下载完成 下载完成后,双击运行解压,默认解压路径,修改为c:/...
DDD 中的实体和值对象有什么区别?
在DDD中,实体 Entity 和值对象 Value Object 是两个基本的概念,它们之间有一些重要的区别。 唯一性:实体是唯一的,每个实体都有一个唯一的标识符,即使它的属性在一段时间内发生了变化,它仍然是这个实体。与…...
算法-最值问题
#include<iostream> using namespace std; int main() {int a[7];//上午上课时间int b[7];//下午上课时间int c[7];//一天总上课时间for (int i 0; i < 7; i) {cin >> a[i] >> b[i];c[i] a[i] b[i];}int max c[0];//max记录最长时间int index -1;//索…...
Go 性能压测工具之wrk介绍与使用
在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug;压力测试(压测)是确保系统在高负载情况下仍能稳定运行的重要步骤。通过模拟高并发场景,可以评估系统的性能瓶颈、可靠…...
数学思想论(有目录)
数学思想是数学发展过程中的重要指导原则,它涉及对数学概念、方法和理论的理解和认识,以及如何利用这些工具来解决实际问题。数学思想的形成和演进是随着数学的发展而逐渐深化的,它体现了人类对数学本质和应用的不断探索和思考。 一些主要的数学思想包括: 函数与方程思想…...
东莞企业怎么做网站建设/汕头seo托管
对于一般的List的排序可以使用java.util.Collections.sort(List, Comparator super T>)這樣簡單易用的方法。但是經常看到有人在問如何對元素的多字段排序。這個問題就像SQL語句裏面的‘Order By’語句,後面可以跟若干個排序條件。譬如對於元素Foo排序࿱…...
好看的网站界面设计/关键词优化搜索排名
导读在上篇中,我们已经创建了一个 shell 主循环、切分了命令输入,以及通过 fork 和 exec 执行命令。在这部分,我们将会解决剩下的问题。首先,cd test_dir2 命令无法修改我们的当前目录。其次,我们仍无法优雅地从 shell…...
阿里巴巴武汉网站建设/适合奖励自己的网站免费
一直对时间函数有点兴趣,今天打开time.h看了一下.发现内容也不是太多.于是看了看.这是c库里的.C的,改日再看.一边看一边写了总结,呵呵,效果不错. 在 time.h 文件中。首先我们可以看到 typedef long time_t; 这就可以明确地知道 time_t是一个long型 而为什么要这样做呢ÿ…...
有什么正网站做兼职的/厦门seo关键词优化
1 ROS必须的环境变量 执行命令: source /opt/ros/ROSDISTRO/setup.bash (Replace ROSDISTRO with the desired ROS distribution, e.g. indigo.)可以完成设置。 当然通常是添加该命令到~/.bashrc,系统启动自动设置这些必须的环境变量。 注意:…...
安庆商务网站建设/百度推广服务费一年多少钱
我在编写客户端 - 服务器应用程序。我有C和Klient中简单内存游戏的游戏服务器。我正在Eclipse中进行开发(一个用于Eclipse的C,一个用于Eclipse的Eclipse)。我使用tpc套接字解决客户端和服务器之间的通信。让我们在服务器上进行基本的操作连接 - 在一种情况下&#x…...
老阿姨哔哩哔哩b站肉片入口直播/网站排名在线优化工具
数据分组就是按照某种统计分析需要,将数据按照某种标准重新划分为不同的组别。比如,想将原始年龄数据重新分组为:0代表≤20岁、1代表20~35岁、2≥35岁,这个怎么在SPSS中实现?毕竟开始统计年龄的数据的时候都是直接统计…...