我们正在将服务从Websocket迁移到HTTP / 2。但是,我们发现,当流ID超出可用范围时,必须重新建立连接。由于我们维护反向代理与实际应用服务器之间的连接,因此它们之间的HTTP / 2连接将每天重新建立几次,并且由服务器启动的事件可能会丢失。
所以,我的问题是我们如何优雅地重新建立服务器之间的连接?
答案 0 :(得分:0)
HTTP / 2流ID的长度为31位,这意味着您可以拥有2 ^ 32-1个流ID,其中奇数的是客户端启动的,甚至是服务器启动的。这是2,147,483,647条可以在流ID耗尽之前发送的消息。
您是否真的每天多次发送超过20亿条消息(美国而不是十亿美元!),这意味着您已达到此限制?如果是这样,我不确定HTTP是最适合您的协议,那么您可能最好坚持使用Web套接字。 HTTP增加了HTTP标头的开销,这意味着它对于频繁发送的小型邮件不是最佳选择。
无论如何回答您的问题,the HTTP/2 spec都会说:
流标识符不能重复使用。长期连接会导致端点耗尽可用范围的流标识符。无法建立新的流标识符的客户端可以为新的流建立新的连接。无法建立新流标识符的服务器可以发送GOAWAY帧,以便客户端被迫为新流打开新连接。
因此,基本上,您必须对客户端和服务器进行编码以处理此问题,并且当客户端无法增加流ID时,客户端应自动启动新的流。这并不是说它应该断开旧的连接,直到所有飞行中的消息都得到答复为止-在一段时间内可能正在进行两个连接。如果这不可能,那么我建议客户端或服务器在限制接近时主动提前关闭连接,并且将新消息排队,直到关闭连接再建立新消息。