我们是否还需要一个用于微服务的 HTTP2 连接池?

Do we still need a connection pool for microservices talking HTTP2?

HTTP2支持多路复用,微服务通信还需要连接池吗? 如果是,拥有这样一个游泳池有什么好处?

示例: 服务 A => 服务 B

以上两种服务只有一个实例可用。

多个连接可能有助于克服每个连接(套接字)的 OS 缓冲区大小限制?还有什么?

是的,您仍然需要连接微服务的客户端中的连接池。

首先,一般来说是服务器控制多路复用量。特定的微服务服务器可能会决定它不能允许超出非常小的多路复用。
如果客户端想要使用负载更高的微服务,它需要准备打开多个连接,这就是连接池派上用场的地方。 这对于处理负载峰值也很有用。

其次,HTTP/2 具有流量控制,这可能会严重限制单个连接上的数据吞吐量。如果流量控制 window 很小(HTTP/2 规范定义的默认值是 65535 字节,这对于微服务来说通常非常小)那么客户端和服务器将花费相当多的时间交换 WINDOW_UPDATE 帧以扩大流量控制 windows,这对吞吐量不利。
为了克服这个问题,您要么需要更多的连接(客户端应该为此做好准备),要么需要更大的流量控制 windows.

第三,在大 HTTP/2 流控制 windows 的情况下,您可能会遇到 TCP 拥塞(这与套接字缓冲区大小不同),因为消费者比生产者慢。它可能是用于客户端上传的慢速服务器(具有大负载的 REST 请求),或者用于服务器下载的慢速客户端(具有大负载的 REST 响应)。
再次克服 TCP 拥塞的解决方案是打开多个连接。

比较微服务用例的 HTTP/1.1 和 HTTP/2,HTTP/1.1 连接池通常比 [= 大得多(例如 10x-50x) 31=] 连接池,但由于上述原因,您仍然需要 HTTP/2 中的连接池。

[免责声明我是 Jetty 中的 HTTP/2 实施者。
我们有一个初始实现,其中 Jetty HttpClient 使用 HTTP/2 传输,每个域有一个硬编码的单一连接,因为这就是 HTTP/2 为浏览器鼓吹的。
当接触到现实世界的用例时——尤其是微服务——我们很快意识到这个想法有多糟糕,并转回为 HTTP/2 使用连接池(就像 HttpClient 总是为 HTTP/1 .1).