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(使用前将#替换为@)