【gRPC】4—gRPC与Netty

news2024/10/11 5:01:51

gRPC与Netty

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐

如果可以,麻烦各位看官顺手点个star~😊

📖RPC专栏:https://blog.csdn.net/weixin_53580595/category_12368218.html

文章目录

  • gRPC与Netty
    • 1 几种常见的RPC IO模型
      • 1.1 BIO模型
      • 1.2 NIO模型
      • 1.3 AIO模型
      • 1.4 RPC性能三要素
    • 2 gRPC client侧线程模型
    • 3 gRPC server侧线程模型
    • 4 gRPC链接状态机


gRPC跟Netty的关系主要包括如下几方面的依赖:

  1. 依赖Netty实现的HTTP/2协议的封装,通过Listener机制监听HTTP/2的数据报文事件,完成网络相关处理;
  2. Reactor IO模型的依赖,Nio/Epoll;
  3. 依赖Netty的ByteBuf完成流数据在内部中的缓存与流转;

1 几种常见的RPC IO模型

1.1 BIO模型

在这里插入图片描述

主要特点

  1. 每个请求一个IO线程处理
  2. Client消息请求与应答由IO线程完成
  3. IO线程在没有处理完之前会同步阻塞

优点

  1. 想啥呢? 没啥优点

缺点

  1. 吞吐低:每个请求一个线程很容易导致server端出现资源瓶颈从而影响吞吐,频繁创建线程也不能合理利用线程资源(可以通过使用线程池来解决)
  2. 稳定性:由于是阻塞模型,遇到网络抖动就凉了
  3. 可维护性:IO线程数无法预估,资源利用率低

1.2 NIO模型

在这里插入图片描述

俗称IO多路复用模型,该线程模型中前端挂载一个Selector用于轮询各个Channel的IO事件,收到后Dispatch到后端Worker线程池去做实际的IO处理(读写等),Worker线程池可以有多种模式,取决于具体设计

主要特点

  1. IO多路复用
  2. 非阻塞

优点

  1. IO非阻塞,可靠性和效率都相应提高

缺点

  1. 轮询的效率可能不高,取决于底层使用的系统库函数(select/poll)
  2. 内存拷贝相关还是会阻塞

1.3 AIO模型

AIO模型跟NIO模型本质的区别是异步,这里异步的含义是指当数据处理完成之后才通知使用方,而NIO是数据就绪之后。

1.4 RPC性能三要素

  1. IO模型:决定了数据发送的效率,可靠性等
  2. 协议:通常内部协议性能会更优
  3. 线程模型:决定编解码、消息接收与返回等在哪个线程执行

2 gRPC client侧线程模型

gRPC client端可以划分出三种线程

  1. Caller线程:业务当前线程
  2. Worker线程(grpc-default-executor):请求处理与响应回调线程
  3. IO线程(grpc-nio-worker-ELG):使用Netty的ELG

以futureClient为例,一次client请求的线程切换如下图:

在这里插入图片描述

整体一次执行流程描述如下:

  1. 创建链接,通常是Delayed的模式,第一次创建Stream时候之前才会创建连接
  2. 创建Stream,代表发起一次请求,在Caller Thread完成
  3. 发送Header,将Header Frame投递到WriteQueue,Call Thread完成,ELG异步消费WriteQueue
  4. 发送Message,将Message Frame投递到WriteQueue,Call Thread完成,ELG异步消费WriteQueue
  5. 接收Header,这里完成一次从ELG -> Worker线程池的切换,需要注意的是如果创建Client时我们指定了directExecutor模式,那么将统一由ELG线程完成
  6. 接收Message,这里完成一次从ELG -> Worker线程池的切换,需要注意的是如果创建Client时我们指定了directExecutor模式,那么将统一由ELG线程完成
  7. 接收关闭Stream请求,线程切换同5,6,最终会回调Future的set方法
  8. Caller Thread通过Future.get获取到结果

3 gRPC server侧线程模型

gRPC server侧主要包括两个线程:

  1. Worker线程(grpc-default-executor):Server启动时候指定
  2. IO线程(grpc-nio-worker-ELG):使用Netty的ELG

以一次Unary请求为例,Server侧线程切换如下:

在这里插入图片描述

整体一次执行流程描述如下:

  1. 接收Client发送的创建Stream的请求,ELG -> Worker线程切换,最终创建一个ServerCall及其Listener
  2. 接收Client发送的Msg,ELG -> Worker线程切换,反序列化保存
  3. Client完成发送,ELG -> Worker线程切换,回调Server业务逻辑
  4. 处理完成发送Header,扔到WriteQueue,ELG异步消费发送Header Frame到Client
  5. 处理完成发送Message,扔到WriteQueue,ELG异步消费发送Message Frame到Client
  6. 完成全部消息发送,标记end of frame,对于unary而言跟5合成一步,扔到WriteQueue,ELG异步消费发送Message Frame到Client
  7. Client发送RstStream请求,并不一定会发送,取决于配置,回调Listener

综上完成了Client与Server线程模型的介绍,结合之前篇章gRPC API设计思路部分,相信大家可以更好的理解一次请求在gRPC内部是如何流转的。下面将介绍一个连接从建立到释放状态流转的过程,从另一种维度介绍gRPC是如何维护连接的。

4 gRPC链接状态机

gRPC内部在Channel构建到销毁的生命周期内,维护了该链接的整个状态的运转,了解内部具体的运转流程有助于我们更好的定位问题。gRPC内部链接主要分成如下几个状态:

  1. CONNECTING:代表Channel正在初始化建立连接,流程会涉及DNS解析、TCP建连、TLS握手等
  2. READY:成功建立连接,包括HTTP2协商,代表Channel可以正常收发数据
  3. TRANSIENT_FAILURE:建连失败或者CS之间网络问题导致,Channel最终会重新发起建立连接请求,gRPC提供了一套backoff Retry机制来保证不会出现重连风暴
  4. IDLE:Channel中长期没有请求或收到HTTP2的GO_AWAY信号会进入此状态,此时CS之间连接已经断开,一旦新请求发起会转移到CONNECTING。主要目的是保障SERVER连接数不会太大造成压力
  5. SHUTDOWN:Channel已经关闭,状态不可逆,新请求会立即失败掉,排队的请求会继续处理完

下图描述了五种状态之间的转换:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TadTR(TIP 2022)视频动作检测方法详解

前言 论文:End-to-end Temporal Action Detection with Transformer 代码:TadTR 从论文题目可以看出 TadTR 是基于 Transformer 的端到端的方法,TAD 在视频动作分类任务上更进一步,不仅对动作分类,还要检测动作发生的…

力扣21~30题

21题(简单): 分析: 按要求照做就好了,这种链表基本操作适合用c写,python用起来真的很奇怪 python代码: # Definition for singly-linked list. # class ListNode: # def __init__(self, v…

每日一题:单例模式

每日一题:单例模式 ❝ 单例模式是确保一个类只有一个实例,并提供一个全局访问点 1.饿汉式(静态常量) 特点:在类加载时就创建了实例。优点:简单易懂,线程安全。缺点:无论是否使用&…

uni-app如何搭建项目(一步一步教程)

来来来,看这里 uni-app新建项目教程uni-app项目结构 首先我们要有一个HBuilder这个软件,然后我们来搭建uni-app项目 uni-app新建项目教程 首先我们打开这个HBuilder软件,好我们就出现这个界面,我们点击新建项目   然后我们选择…

Github优质项目推荐 - 第六期

文章目录 Github优质项目推荐 - 第六期一、【WiFiAnalyzer】,3.4k stars - WiFi 网络分析工具二、【penpot】,33k stars - UI 设计与原型制作平台三、【Inpaint-Anything】,6.4k stars - 修复图像、视频和3D 场景中的任何内容四、【Malware-P…

小猿口算APP脚本(协议版)

小猿口算是一款专注于数学学习的教育应用,主要面向小学阶段的学生。它提供多种数学练习和测试,包括口算、速算、应用题等。通过智能化的题目生成和实时批改功能,帮助学生提高数学计算能力。此外,它还提供详细的学习报告和分析,帮助家长和教师了解学生的学习进度和薄弱环节…

批量处理vue2中文硬编码转i18n国际化(保姆级)

文章目录 背景技术选型使用软件与插件插件使用补充 背景 公司的项目需要适应国际化的需求,但是因为代码是一个成品的项目,也就导致,代码量巨大,连带着需要转国际化的硬编码中文也很多,如果一点点纯手工改动&#xff0…

RelationGraph实现工单进度图——js技能提升

直接上图: 从上图中可以看到整个工单的进度是从【开始】指向【PCB判责】【完善客诉】【PCBA列表】,同时【完善客诉】又可以同时指向【PCB判责】【PCBA列表】,后续各自指向自己的进度。 直接上代码: 1.安装 1.1 Npm 方式 npm …

“探索端智能,加速大模型应用” 火山引擎边缘智能x扣子技术沙龙圆满落幕!

9月21日,火山引擎边缘智能扣子技术沙龙在上海圆满落地,沙龙以“探索端智能,加速大模型应用”为主题,边缘智能、扣子、地瓜机器人以及上海交通大学等多位重磅嘉宾出席,从多维视角探讨 AI、 AIoT、端侧大模型等技术与发展…

嵌入式数据结构中线性表的具体实现

大家好,今天主要给大家分享一下,如何使用数据结构中的线性表以及具体的实现。 第一:线性表的定义和表示方法 线性表的定义 – 线性表就是零个或多个相同数据元素的有限序列。 • 线性表的表示方法 – 线性表记为: L=(a0,∙∙∙∙∙∙∙∙ai-1aiai+1 ∙∙∙∙∙∙an-1) •…

HTTP的工作原理

HTTP(Hypertext Transfer Protocol)是一种用于在计算机网络上传输超文本数据的应用层协议。它是构成万维网的基础之一,被广泛用于万维网上的数据通信。(超文本(Hypertext)是用超链接的方法,将各种不同空间的文字信息组…

数据交换的金钟罩:合理利用安全数据交换系统,确保信息安全

政府单位为了保护网络不受外部威胁和内部误操作的影响,通常会进行网络隔离,隔离成内网和外网。安全数据交换系统是专门设计用于在不同的网络环境(如内部不同网络,内部网络和外部网络)之间安全传输数据的解决方案。 使用…

Redis 其他类型 渐进式遍历

我们之前已经学过了Redis最常用的五个类型了,然而Redis还有一些在特定场景下比较好用的类型 Redis最关键的五个数据类型: 上面的类型是非常常用,很重要的类型。 除此之外的其他类型不常用,只是在特定的场景能够发挥用处&#…

澳鹏干货 | 大语言模型的上下文窗口 (Context Windows)

大语言模型(LLMs)极大地提升了人工智能在理解和生成文本方面的能力。其中一个影响其效用的重要方面是“上下文窗口”(Context Windows)—— 这个概念直接影响着模型接收和生成语言的有效性。 本期澳鹏干货将深入探讨上下文窗口对…

微软确认Word离奇Bug 命名不当会导致文件被删

微软近日确认Word应用中存在一个Bug,该漏洞可能导致用户在特定情况下错误地删除文件。该问题主要出现在文件命名过程中,如果用户在保存Word文件时采用特定的命名方式,文件可能会被移动到回收站。 根据微软支持中心的消息,如果用户…

MVS海康工业相机达不到标称最大帧率

文章目录 一、相机参数设置1、取消相机帧率限制2、修改相机图像格式3、调整相机曝光时间4、检查相机数据包大小(网口相机特有参数)5、 恢复相机默认参数6、 相机 ADC 输出位深调整 二、系统环境设置1、 网口相机设置2、 USB 相机设置 一、相机参数设置 …

java对接GPT 快速入门

统一对接GPT服务的Java说明 当前,OpenAI等GPT服务厂商主要提供HTTP接口,这使得大部分Java开发者在接入GPT时缺乏标准化的方法。 为解决这一问题,Spring团队推出了Spring AI ,它提供了统一且标准化的接口来对接不同的AI服务提供商…

毕设分享 大数据用户画像分析系统(源码分享)

文章目录 0 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

Linux查看下nginx及使用的配置文件

1、查到nginx进程 ps -aef | grep nginx2、通过进行pid查到nginx路径 pwdx <pid>3、根据路径得到配置文件 path***/nginx -t如下&#xff1a;

Unity网络开发基础 —— 实践小项目

概述 接Unity网络开发基础 导入基础知识中的代码 需求分析 手动写Handler类 手动书写消息池 using GamePlayer; using System; using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 消息池中 主要是用于 注册 ID和消息类…