【发布时间】:2017-05-26 08:45:46
【问题描述】:
我们最近从 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=""
我想更好地了解这里发生了什么。 go http2 包或我们的代码是否应该通过重试请求来自动处理 GOAWAY?我对 http2 不够熟悉,不知道是否需要 GOAWAY,这意味着我们的 Go 客户端不应将其作为错误条件处理,或者这是否表明 ALB 出现问题。
【问题讨论】:
-
您可能想添加一个问题或以某种方式进一步解释问题所在。
-
@thomasdarvik - 完成,谢谢
-
GOAWAY框架在客户端的表现是什么?客户是在积极地做一些被打断的事情,还是只是被记录下来?
-
@JimB - 目前我们的 go HTTP 客户端代码等效地处理所有错误,它们被记录为错误并且请求被中止。这段代码早于我们从 ELB 转移到 ALB 之前,当使用 ELB(和 http/1.1)时,所有协议错误都是实际错误。客户端在请求之间以 1s 循环遍历相同的 Web 请求。每个请求大约需要 5 秒。
-
@BrianF:我认为 GOAWAY 是由客户端更透明地处理的东西,例如
Connection: close,但 ALB 也可能做错了事。无论如何,您需要处理它,我认为您仍然可以像处理任何其他协议或网络错误一样处理它。如果您在拨号或连接失败时重试,我会在这种情况下做同样的事情。
标签: amazon-web-services go amazon-ec2 amazon-elb http2