Go问答 为什么gRPC客户端不提供连接池?

stirlingx · 2017年04月19日 · 最后由 tsingson 回复于 2019年10月02日 · 1682 次阅读

为什么grpc-go不提供连接池?是因为底层采用了 http2,支持多路复用,并发量已经足够高了?

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio

是的,常规的 TCP 连接池仅仅是为了解决并发问题。

http 协议是短连接,它的好处是支持负载均衡,http2 虽然是长连接,但只是多路复用,不是跟 tcp 完全一样的长连接,我的理解是 TCP 连接是有状态的,而 http2 应该跟 http 一样是无状态的吧,也就是 http2 能复用就复用,不能复用就重新开一个

通常使用 TCP 长连接的 RPC,比如以前的 protobuf-rpc-pro, dubbo 也是单连接。 使用 HTTP2 多路复用和 TCP 连接多路复用,本质上没什么区别。

我们知道 grpc 使用 http2.0,而 http2.0 有多路复用,但是如果只是一个链接,不同的线程对写数据的话,发送端的 buffer 是不是需要设置的很大才行,不然会慢吧.

http2 的单连接在 read frame 和 write frame 两个点如果并发量过高竞争是很激烈的,http1.1 每个请求独占 tcp 连接,通过 tcp 连接数量给请求处理提供并发能力。而 grpc-go 是将单连接上所有请求分 frame 利用 queue 一点一点发,而且是发完一个就排到 queue 的尾部等待,所以一个连接上无度的接收 stream 就会导致 queue 长度增大所有请求整体耗时增加。

http2 和 http1.1 的本质在于对 tcp 连接的利用率,所以不能单纯说 grpc-go 在单连接上提供的并发度够高,grpc-go 同样需要连接池来防止单连接随着 stream 并发量上升导致请求处理链路中各处的 lock 竞争过于激烈。只是在 http2 上建立连接池会比 http1.1 更少,如果不少,http2 引入 stream/frame/flow-control 就没意义了。

<p><br></p><p><br></p><p>可以试一下这个库 &nbsp;<span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, " courier="" new",="" monospace;="" font-size:="" 13px;="" background-color:="" rgb(245,="" 245,="" 245);"="">github.com/processout/grpc-go-pool</span></p><p><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, " courier="" new",="" monospace;="" font-size:="" 13px;="" background-color:="" rgb(245,="" 245,="" 245);"=""><br></span></p><p><font color="#333333"><span style="caret-color: rgb(51, 51, 51);">但在使用这个库时, 建议在 gRPC 客户调用服务端时, 加上 grpc.WaitForReady(true) 这个参数.</span></font></p><p><font color="#333333"><span style="caret-color: rgb(51, 51, 51);"><br></span></font></p><p><font color="#333333"><span style="caret-color: rgb(51, 51, 51);">例如: &nbsp;&nbsp;</span></font><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">result</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">, </span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">er1 </span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">:= </span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">e</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">.xxxGrpc</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">Client</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">.CallHello</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">(</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">ctx</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">, </span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">in</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">, </span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">grpc</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">.</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">WaitForReady</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">(</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">true</span><span style="color: rgb(51, 51, 51); font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; font-size: 13px; background-color: rgb(245, 245, 245);">))</span></p>

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册