gRPC运行过程与流量控制机制

2023-11-16

gRPC运行过程与流量控制

gRPC中的流量控制

流量控制是一个网络组件的基本功能, 我们熟知的 TCP 协议就规定了流量控制算法. gRPC 建立在 TCP 之上, 也依赖于 HTTP/2 WindowUpdate Frame 实现了自己在应用层的流量控制。

流量控制, 一般来说指的是在网络传输中, 发送者主动限制自身发送数据的速率或发送的数据量, 以适应接收者处理数据的速度——当接收者的处理速度较慢时, 来不及处理的数据会被存放在内存中, 而当内存中的数据缓存区被填满之后, 新收到的数据就会被扔掉, 导致发送者不得不重新发送, 就会造成网络带宽的浪费.

流量控制是双向的,并且,gRPC中控制流量是作用在HTTP2 data frame上的。

讲解思路

目前,grpc(v1.49.0) 存在三种流量控制的方式,BDP采样流量控制、connect level 流量控制、steam level流量控制。接下来我会详细介绍这三者的过程,并结合关键源代码来分析讲解。

因为这三种流量控制的作用细粒度存在递进关系。所以,会先单独地讲前两种控制,在第三种stream level流量控制的时候,再将它们组合连贯起来,通过源码步骤来看gRPC的运行过程。

另外,讲解源代码的方式通过这样展示:

// 下面的每一句都是源代码中copy出来的
s.Serve(listen)  // 初步的入口
  s.handleRawConn(lis.Addr().String(), rawConn)  // 缩进表示进入了Server函数里面
    s.newHTTP2Transport(...)                     // ...表示省略了一些参数
      st.HandleStreams --> func (t *http2Server) HandleStreams()  // 表示接口实现

这样可以看到源代码的运行流程,篇幅也易于观看。
更重要的是,希望读者可以跟着点击进入函数来查看,手动查找这些关键代码来了解它的运行,并且,我相信找的过程一定会有额外的收获。毕竟实践总能收获更多且会印象深刻。

!!!

文章需要具备有gRPC基础知识,了解gRPC主要结构对象的作用,以及知道client与server之间的过程。
这部分知识可以看我之前的一篇grpc介绍文章:
gRPC基础解读:https://blog.csdn.net/m0_60647847/article/details/126713300
或者,看下面这篇文章:
gRPC概述:https://juejin.cn/post/7089739785035579429

这里放一张图,涉及grpc交互时候的一些结构,方便查看。
请添加图片描述

期待这篇文章更够给你带来一些收获。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gRPC运行过程与流量控制机制 的相关文章

  • System.Web.HttpException 无法加载类型“[命名空间].???”

    这开始于无法加载类型 全局 错误 在我尝试了一些方法后 没有找到删除 Global asax 文件的位置 现在错误是无法加载类型 namespace 在哪里 是我尝试加载的每个页面的类名 该网站 在 VS2008 本地开发计算机中执行时 工
  • 使用“邮递员”chrome 应用程序的肥皂请求正文

    假日网络服务 的肥皂请求正文会是什么样子 http www holidaywebservice com HolidayService v2 HolidayService2 asmx wsdl http www holidaywebservi
  • Firebase Auth - 最近登录多长时间

    我有一个个人资料选项卡 用户可以在其中按编辑并编辑他们的个人资料 我只想在必要时才需要他们的密码 所以想知道用户登录的时间是多少毫秒 这使得它不是最近登录 其中firebase会抛出错误 auth requires recent login
  • 在 Blogger 中使用相对链接

    我正在使用博主 当我需要在我的博客文章中提到一个链接并且该链接实际上是我自己的博客文章的链接时 我在其旁边提到标签 www my blog name blogspot in 12 2013 how to do html if i chang
  • MVC4更新部分视图

    我正在开发一个简单的 MVC 应用程序 我有主视图 部分视图和控制器 这是我的主要视图 model partitalViewTest Models Qset div class transbox style height 1 Html Pa
  • Chrome:网络元素自动移动

    我正在开发一个网络项目 在过去的两周里 我正在进行学期考试 所以我要休息一下 现在 既然他们已经结束了 我又继续我的工作了 但我发现我的一些Web 元素 如按钮 span 在 Chrome 上移动了一些像素 在 IE 和 Mozilla 上
  • IIS 8 HTTPS/需要 SSL 导致超时错误

    尝试通过 IIS 8 通过 SSL 发布网站 但出现超时错误 任何帮助表示赞赏 采取的步骤 已验证该网站可以通过 HTTP 访问 http xxx xxx xxx xxx有效 此时使用 IP 地址 如果重要的话 IIS gt 服务器证书 g
  • 如何从文件系统访问 api window.showDirectoryPicker() 获取选定的目录路径

    当我选择一个文件夹时 我确实得到了 dirHandle 但无法弄清楚什么属性或方法将为我提供完整路径 const dirHandle await window showDirectoryPicker 所以类似 let path dirHan
  • 如何获取dart中当前和调用函数的名称?

    C has System Reflection MethodBase GetCurrentMethod Name Dart 是否有类似的东西 但返回当前正在运行的函数以及调用当前运行函数的函数的名称的结果 我编写了一个简单的类 它提供当前函
  • 找不到模块:错误:包路径。未从包中导出

    import firebase from firebase const firebaseConfig apiKey AIzaSyBOK7x5N5UnjY4TDqndzH7l5tvdNIsWFRc authDomain todo app e3
  • 为什么 [System.ComponentModel.ToolboxItem(false)] 默认出现在 Asp.net Web 服务中

    谁能告诉我为什么 System ComponentModel ToolboxItem false 是在Asp net Web服务中使用的吗 或许你可以在这里找到一些答案 NET API 浏览器 ToolboxItemAttribute 布尔
  • Azure Web 角色中的网站项目

    我正在研究一个新的 ASP Net 项目 我们希望将其托管在 Windows Azure Web 角色中 该项目的技术要求之一是利用 ASP Net 的完整预编译选项 不可更新 单页程序集 Web Site项目模型 与 ASP Net 相反
  • Laravel htmlspecialchars() 期望参数 1 是我的项目中给出的字符串、对象?

    所以我正在尝试编写一个简单的网站表单 但它有这个 htmlspecialchars 错误 我尝试制作 message 但没有成功 有同样的错误 这是我的控制器
  • CSS3 与 JavaScript

    所以我试图在网页上创建一个动画 并试图找到一种使用 CSS3 来实现它的方法 但我对如何做到这一点感到非常困惑 我需要发生的是 当用户单击链接元素时 我希望 div 展开并填充特定于所单击的链接元素的内容 例如 当用户单击标题为 About
  • 将您的应用程序链接到现有页面

    我搜索了又搜索 似乎找不到任何与此相关的信息 我们有一个 Facebook 页面 facebook com companyname 我们在 Facebook 上也有一个应用程序 apps facebook com companyname 我
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • Tornado websocket handler , self.close() 正在关闭连接而不触发 on_close() 方法

    我是 python stackoverflow tornado 的新手 所以请耐心等待 纠正我 我正在使用龙卷风开发实时应用程序 当我在 Websocket 处理程序类中调用 self close 时 on close 方法不会启动 这次我
  • 向下滚动时如何使图像移动?

    这是我想要实现的目标的示例 https www flambette com en https www flambette com en 我尝试过更改图像的 css 属性 但效果不能满足我的需求 我尝试过以下代码 mydocument on
  • 使用 MediaWiki API 下载图像?

    是否可以使用 MediaWiki API 从维基百科下载图像 不 无法通过 API 获取图像 MediaWiki 中的图像仅存储在文件夹中 而不是存储在数据库中 并且不会动态传递 更多信息请参见手册 图像管理 http www mediaw
  • Protobuf RPC 在 Hadoop 2.2.0 单节点服务器上不可用?

    我正在尝试在按照本教程安装的本地单节点集群上运行 hadoop 2 2 0 mapreduce 作业 http codesfusion blogspot co at 2013 10 setup hadoop 2x 220 on ubuntu

随机推荐

  • go语言面试题:令牌桶算法原理

    令牌桶算法是一种常见的限流算法 它基于一个简单的思想 系统中的请求像一个桶 在请求发送之前都需要从桶中获取一个令牌 如果桶里没有可用的令牌 则该请求会被暂时禁止 具体来说 令牌桶算法会在桶内放入固定数量的令牌 这些令牌以固定的速率自动回复
  • 二阶系统响应指标图_一阶和二阶系统的动态特性参数

    检测系统的时域动态性能指标一般都是用阶跃输入时检测系统的输出响应 即过渡过程曲线上的特性参数来表示 1 一阶系统的时域动态特性参数 一阶测量系统时域动态特性参数主要是时间常数及与之相关的输出响应时间 1 时间常数 时间常数是一阶系统的最重要
  • 三十一.刷题.20

    统计给定的n个数中 负数 零和正数的个数 include
  • LeetCode 1309. 解码字母到整数映射

    给你一个字符串 s 它由数字 0 9 和 组成 我们希望按下述规则将 s 映射为一些小写英文字符 字符 a i 分别用 1 9 表示 字符 j z 分别用 10 26 表示 返回映射之后形成的新字符串 题目数据保证映射始终唯一 示例 1 输
  • 练习题:猜年龄游戏升级版

    猜年龄游戏升级版 需求 1 允许用户最多尝试3次 2 每尝试3次后 如果还没猜对 就问用户是否还想继续玩 如果回答Y或y 就继续让其猜3次 以此往复 如果回答N或n 就退出程序 3 如何猜对了 就直接退出 import random n r
  • mysql基础--存储过程

    文章目录 MySQL存储过程 1 创建存储过程 2 调用存储过程 3 变量定义 3 1 局部变量 3 2 用户变量 3 3 系统变量 3 3 1 系统变量 全局变量 3 3 2 系统变量 会话变量 4 存储过程传参 4 1 in 4 2 o
  • Unity进阶--物品,背包,角色管理器

    文章目录 物品管理器 背包管理器 角色管理器 物品管理器 物品数据 Item json json部分 Resources Data Item id 1 name 新手剑 des 这是一把宝剑 price 200 icon attack 10
  • C语言:通过函数指针来完成两个数的加减乘除(函数指针当做参数使用)

    main c Function pointer Created by mac on 15 8 2 Copyright c 2015年 All rights reserved 要求 将函数指针做参数来求两个整数的和 差 积 商 知识点 函数指
  • 【深度学习与计算机视觉】10、深度学习框架Tensorflow

    Tensorflow
  • python做的多激光雷达外参标定程序(初版本 完整版见专栏)

    查阅了一番资料和现有的代码后发现 现在的多个激光雷达之间的标定程序都是ROS框架下面的 并且都是C 代码 需要安装的依赖也比较复杂 于是自己写了一个python版本的标定程序 依赖非常简单 Windows系统也可以运行 并且代码简单 扩展性
  • 网络安全—DDOS和CC攻击的区别

    DDOS和CC攻击的区别 1 攻击简介 DDOS 分布式拒绝服务攻击 通过向目标发送大量数据包 耗尽其带宽 来使目标无法可用 CC攻击 DDOS的一种 也可以理解为应用层DDOS攻击 利用大量代理服务器对目标计算机发起大量连接 导致目标服务
  • 华中师范大学2018年874

    lt 对数组A的N个整数从小到大进行连续编号 输出各个元素的编号 例如对数组 A 5 3 4 7 3 5 6 则输出为 3 1 2 5 1 3 4 include
  • C++ 模板的显示具体化

    C 没有办法限制类型参数的范围 我们可以使用任意一种类型来实例化模板 但是模板中的语句 函数体或者类体 不一定就能适应所有的类型 可能会有个别的类型没有意义 或者会导致语法错误 例如有下面的函数模板 它用来获取两个变量中较大的一个 temp
  • maven的5种打包方式,终有一款适合你(一)

    话不多说 上主题 1 1 概述 在讲打包方式之前 首先来说最近踩到的坑 在idea新建的maven项目 在pom文件中会自动生成一段插件的管理器 我使用maven打包插件maven assembly plugin 将其配置添加到
  • Jetson-nano:制作TF卡启动

    旧Nano可以直接导入镜像至TF卡 然后插入卡槽即可启动系统 但目前旧的英伟达已经停止生产底板 现在市面上都是带emmc的核心板 底板是由其他厂商进行扩容自行生产的 因为官方自带的emmc只有16G 如果做扩展使用 就要使用到扩容的TF卡
  • 零基础必知8个测试工具

    1 Fiddler 网络抓包工具 Fiddler在测试中一般用于篡改接口请求或接口返回数据以测试前后端业务场景或对异常功能的兼容 它能监控进出设备的http协议请求 并且支持重新编辑请求与返回 从而测试前端页面对不同结果的反应 官网下载地址
  • map遍历的4种方式

    map遍历的方式有4种 1 使用for循环遍历map 2 使用迭代器遍历map 3 使用keySet迭代遍历map 4 使用entrySet遍历map 创建一个Map集合 Map
  • 使用Java8的Stream进行多字段排序以及剔除非空字段排序

    使用 Stream的sort 方法 并结合 Comparator 类 进行排序 主要解决以下两个问题 一 当某个字段为空时 怎么进行排序 使用 Comparator nullsFirst 或者 Comparator nullsLast 进行
  • 出现"/var/lib/mysql/mysql.sock“不存在的解决方法

    出现 var lib mysql mysql sock 不存在的解决方法 SQLSTATE HY000 2002 Can t connect to local MySQL server through socket var lib mysq
  • gRPC运行过程与流量控制机制

    文章目录 gRPC运行过程与流量控制 gRPC中的流量控制 讲解思路 BDP采样流量控制 结构分析 过程分析 Connection Level 流量控制 结构分析 过程分析 Stream level流量控制 结构分析 过程分析 总结 参考