【gRPC】4—gRPC与Netty

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.xdnf.cn/news/1560416.html

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

相关文章

力扣 前缀和

找子数组的个数了解前缀和的基础。 前缀和大致理解为到达某个位置,前面几个数的总和,即s[i1]s[i]a[i1],可以通过一次循环获得。然后几个前缀和作差,即可得到某个位置到某个位置的和,根据map的键值对进行更新次数。 题…

opencv实战项目(三十一):基于同态滤波的图像亮度提升

文章目录 前言一、同态滤波二、算法实现 前言 在数字图像处理领域,图像亮度的调整是一项基本且至关重要的技术。它不仅关系到图像的视觉效果,而且在许多实际应用中,如医疗影像分析、卫星遥感监测、视频监控系统等,都扮演着关键角…

基于STM32 ARM+FPGA+AD的电能质量分析仪方案设计(一)硬件设计

电能质量分析系统硬件设计 3.1 电能质量分析系统设计要求 本系统实现对电能质量的高精度测量,根据国家相关电能质量分析仪器规定 标准以及对市场电能质量分析仪的分析,指定以下设计目标。 ( 1 )电能质量参数测量精度&#xf…

欧科云链研究院深掘链上数据:洞察未来Web3的隐秘价值

目前链上数据正处于迈向下一个爆发的重要时刻。 随着Web3行业发展,公链数量呈现爆发式的增长,链上积聚的财富效应,特别是由行业热点话题引领的链上交互行为爆发式增长带来了巨量的链上数据,这些数据构筑了一个行为透明但与物理世…

【部署篇】Redis-01介绍‌

一、Redis介绍‌ 1、什么是Redis? ‌Redis,英文全称是Remote Dictionary Server(远程字典服务),Redis是一个开源的、使用‌ANSI C语言编写的‌Key-Value存储系统,支持网络、可基于内存亦可持久化。‌ 它提…

leetcode hot100_part3_滑动窗口

滑动窗口是有一个基本的模版的,不要自己想当然哦~ 滑动窗口算法思想(附经典例题)_滑动窗口的思想-CSDN博客 滑动窗口也叫同向双指针;可以先看一下灵山视频:滑动窗口【基础算法精讲 03】_哔哩哔哩_bilibili 3.无重复字…

【unity进阶知识12】从零手搓unity存档存储数据持久化系统,实现对存档的创建,获取,保存,加载,删除,缓存,加密,支持多存档

文章目录 前言一、Unity对Json数据的操作方法一、JsonUtility方法二、Newtonsoft 二、持久化的数据路径三、数据加密/解密加密方法解密方法 四、条件编译指令限制仅在编辑器模式下进行加密/解密四、数据持久化管理器1、存档工具类2、一个存档数据3、存档系统数据类4、数据存档存…

【Oracle数据库进阶】001.SQL基础查询_查询语句

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :&#x1…

安卓使用.9图实现阴影效果box-shadow: 0 2px 6px 1px rgba(0,0,0,0.08);

1.安卓实现阴影效果有很多种&#xff0c;一般UX设计会给以H5参数box-shadow: 0 2px 6px 1px rgba(0,0,0,0.08);这种方式提供背景阴影效果&#xff0c;这里记录一下实现过程 2.界面xml源码 <?xml version"1.0" encoding"utf-8"?> <layout xmlns…

【SEO】什么是SEO?

什么是SEO&#xff08;搜索引擎优化&#xff09;&#xff1f;为什么SEO对于⼀个⽹站⾄关重要&#xff1f; SEO 全称是搜索引擎优化&#xff08;Search Engine Optimization&#xff09; 因为我们目前开发的网址&#xff0c;需要人看到&#xff0c;除了通过宣传营销的方式展现…

kubernetes中微服务部署

微服务 问&#xff1a;用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f; 答&#xff1a;需要通过微服务暴漏出去后才能被访问 Service 是一组提供相同服务的Pod对外开放的接口借助Service&#xff0c;应用可以实现服务发现和负载均衡Service 默认只…

Docker容器简介及部署方法

1.1 Docker简介 Docker之父Solomon Hykes&#xff1a;Docker就好比传统的货运集装箱 2008 年LXC(LinuX Contiainer)发布&#xff0c;但是没有行业标准&#xff0c;兼容性非常差 docker2013年首次发布&#xff0c;由Docker, Inc开发 1.1.1什么是Docker Docker是管理容器的引…

苹果秋季盛典:iPhone 16系列引领未来科技潮流

9月10日&#xff0c;苹果公司在众人瞩目中举办了2024年的秋季特别活动&#xff0c;发布了备受期待的iPhone 16系列。 尽管网络发布会已经持续了一整年&#xff0c;但熬夜观看的果粉们仍然热情不减&#xff0c;因为每一次苹果的新品发布都代表着科技界的一次重大飞跃。 iPhone …

scau:面向对象java实验作业1-2 猜数字游戏

题目名称实验1-2 猜数字游戏题目关键字数据类型 基本输入输出 控制语句 方法题目录入时间2022/10/10 11:01:37题目内容 使用Java程序&#xff0c;项目名称&#xff1a;GuessNumberGame&#xff0c;类根据自己需要定义。 程序开始运行后&#xff0c;允许玩家进行多次猜数字的游…

使用 Docker 部署前端项目:Vue 和 React 结合 Nginx 实现静态文件托管

使用 Docker 部署前端项目&#xff1a;Vue 和 React 结合 Nginx 实现静态文件托管 Web 开发中&#xff0c;将前端项目&#xff08;例如 Vue 或 React 应用&#xff09;打包后通过 Docker 容器和 Nginx 部署是非常常见的方式。它不仅简化了部署流程&#xff0c;还能确保在不同环…

通信协议 —— RS485 讲解得好

目 录 RS-485 通信协议一、重要性二、通信实现三、其它通信方式3.1 串口通信3.2 RS232标准 四、总结 RS-485 通信协议 RS-485是一种通用的通信标准&#xff0c; RS是Recommended Standard的意思&#xff0c;是美国电子工业协会&#xff08;EIA&#xff09;在1983年批准了一个新…

【操作系统】深入探索:操作系统内核与用户进程的数据交互艺术

目录 一、数据从内核缓冲区拷贝到用户进程缓冲区&#xff0c;是谁来负责拷贝的&#xff0c;是操作系统还是用户进程&#xff1f;实际的执行者到底是谁&#xff1f;二、系统调用以及用户态内核态的相互转换1、系统调用2、用户态内核态的相互转换 三、如何形象的理解linux的虚拟地…

【华为】基于华为交换机的VLAN配置与不同VLAN间通信实现

划分VLAN&#xff08;虚拟局域网&#xff09;主要作用&#xff1a; 一、提高网络安全性 广播域隔离访问控制增强 二、优化网络性能 减少网络拥塞提高网络可管理性 sysytem-view #进入系统视图配置参数 vlan batch 10 20 #批量创建vlan LSW3: int g0/0/1 port…

RTSP 音视频play同步分析

基础理论 RTSP RTP RTCP SDP基础知识-CSDN博客 关于RTP的时间戳知识点回顾 时间戳单位&#xff1a;时间戳计算的单位不是秒&#xff0c;而是采用采样频率的倒数&#xff0c;这样做的目的是为了使时间戳单位更为精准。比如说一个音频的采样频率为8000Hz&#xff0c;那么我们可…

Vue使用@别名替换后端ip地址

1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API&#xff0c;并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后&#xff0c;就可以导入nodejs的 path模块&#xff0c;在下面代码 import path…