我们最近从 ELB 切换到 ELB2/ALB,有时我们的 go http/2 客户端会看到来自我们的应用程序负载均衡器的GOAWAY消息,我无法解释。目标组服务器仅支持 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=""
Run Code Online (Sandbox Code Playgroud)
我想更好地了解这里发生了什么。go http2 包或我们的代码是否应该通过重试请求来自动处理 GOAWAY?我对 http2 不太熟悉,不知道是否需要 GOAWAY,这意味着我们的 Go 客户端不应将其作为错误条件处理,或者这是否表明 ALB 出现问题。