gpt4 book ai didi

amazon-web-services - AWS/ALB、http/2 和 GOAWAY

转载 作者:IT王子 更新时间:2023-10-29 01:01:47 24 4
gpt4 key购买 nike

我们最近从 ELB 切换到 ELB2/ALB,偶尔我们的 go http/2 客户端会看到 GOAWAY来 self 们的 Application Load Balancer 的消息,我无法解释。目标组服务器仅支持 http/1.1,我们的负载均衡器应始终至少轮换一台健康的服务器。

在 ALB 中注册新实例时,我可以可靠地重现 GOAWAY。当目标处于“初始”状态时,ALB 返回 GOAWAY。此外,即使 ALB 以 GOAWAY 进行响应,该请求也会成功将其发送到在目标组中注册的其他实例。因此,给定实例 web0 和 web1,如果我取消注册 web0 并重新注册该目标,如果我在 web0 处于“初始”状态时发出请求,我可以可靠地重现 GOAWAY。然而,我们的日志显示 web1 成功处理了请求。

我们的客户端是一个使用 http.DefaultClient 的 Go 程序.我可以使用 Go 1.7 和 1.8beta2 重现此行为。

发生这种情况时,我们的客户端会记录有关 HTTP/2 响应的更多详细信息:

http2: server sent GOAWAY and closed the connection; LastStreamID=1, ErrCode=NO_ERROR, debug=""

我想更好地了解这里发生了什么。 go http2 包或我们的代码是否应该通过重试请求自动处理 GOAWAY?我对 http2 不够熟悉,不知道是否需要 GOAWAY,这意味着我们的 Go 客户端不应将其作为错误条件处理,或者这是否表明 ALB 出现问题。

最佳答案

关于GOAWAY

GOAWAY 框架包含三个可以帮助您解决问题的信息:

 +-+-------------------------------------------------------------+
|R| Last-Stream-ID (31) |
+-+-------------------------------------------------------------+
| Error Code (32) |
+---------------------------------------------------------------+
| Additional Debug Data (*) |
+---------------------------------------------------------------+
  • Last-stream-ID 是最后一个被正确处理的 ID。这可能有助于理解正在发生的事情:RFC 有一些关于如何实现正常关闭的建议:首先发送一个带有 Last-Stream-IDGOAWAY 帧NO_ERROR,让客户端知道即将关闭,然后在一段时间后,发送另一个 GOAWAY 帧,其中 Last-Stream-ID 设置为实际最后处理的 ID。这样客户就知道传递了什么。这是来自 RFC7540, 6.8 GOAWAY 的相关摘录

A server that is attempting to gracefully shut down a connectionSHOULD send an initial GOAWAY frame with the last stream identifierset to 2^31-1 and a NO_ERROR code. This signals to the client thata shutdown is imminent and that initiating further requests isprohibited. After allowing time for any in-flight stream creation(at least one round-trip time), the server can send another GOAWAYframe with an updated last stream identifier. This ensures that aconnection can be cleanly shut down without losing requests.

  • 错误代码和额外的调试数据(字符串)将包含解释正在发生的事情的额外信息。 RFC 7540, 7. Error Codes有可能的错误代码列表。然后根据服务器实现,您可能有一个字符串来缩小错误范围。 For example in H2O, the server sends found an upper-case letter in header name 当在 header 名称中发现大写字母时。

这个特殊的 GOAWAY

http2:服务器发送 GOAWAY 并关闭连接; LastStreamID=1, ErrCode=NO_ERROR, debug=""

由于服务器正在发送 NO_ERROR,您的客户端应该简单地尝试重新连接,而不是将消息视为错误。

至于 为什么 ALB 发送 GOAWAYs...我不确定,你能给我们更多细节吗?

关于amazon-web-services - AWS/ALB、http/2 和 GOAWAY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41592929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com