首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS/ALB、http/2和GOAWAY

AWS/ALB、http/2和GOAWAY
EN

Stack Overflow用户
提问于 2017-01-11 22:02:03
回答 2查看 2.7K关注 0票数 3

我们最近从ELB切换到ELB2/ALBs,偶尔我们的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响应的更多详细信息:

代码语言:javascript
复制
http2: server sent GOAWAY and closed the connection; LastStreamID=1, ErrCode=NO_ERROR, debug=""

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

EN

回答 2

Stack Overflow用户

发布于 2017-01-12 00:25:33

关于GOAWAY

GOAWAY帧包含三条信息,可帮助您排除故障:

代码语言:javascript
复制
 +-+-------------------------------------------------------------+
 |R|                  Last-Stream-ID (31)                        |
 +-+-------------------------------------------------------------+
 |                      Error Code (32)                          |
 +---------------------------------------------------------------+
 |                  Additional Debug Data (*)                    |
 +---------------------------------------------------------------+

的相关摘录

尝试正常关闭连接的服务器应发送一个初始

帧,其中最后一个流标识符设置为2^31-1,并发送一个NO_ERROR代码。这向客户端发出即将关闭的信号,并且禁止发起进一步的请求。在为任何动态流创建留出时间(至少一个往返时间)之后,服务器可以发送另一个具有更新的最后一个流标识符的GOAWAY帧。这确保了连接可以干净地关闭,而不会丢失请求。

  • 错误代码和附加的调试数据(一个字符串)将包含解释所发生的事情的附加信息。RFC 7540, 7. Error Codes提供了可能的错误代码列表。然后,根据服务器实现的不同,您可能会使用一个字符串来缩小错误范围。在题头名称中找到大写字母时的For example in H2O, the server sends found an upper-case letter in header name

这个特别的GOAWAY

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

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

至于为什么ALB要发送GOAWAY。我不确定,你能给我们更多的细节吗?

票数 4
EN

Stack Overflow用户

发布于 2017-03-09 05:25:35

@frederik deweerdt的答案应该被接受,特别是关于应用程序负载均衡器,这是亚马逊网络服务论坛上类似问题的答案,https://forums.aws.amazon.com/thread.jspa?messageID=771883򼜫

客户端收到的HTTP/2GOAWAY响应是应用程序负载均衡器正常关闭的连接。应用程序负载均衡器通常允许空闲连接持续到配置的空闲超时,该超时的默认值为60秒。但是,有一些条件可以触发空闲连接的关闭。在HTTP/1.1连接上,允许未完成的请求完成,然后正常断开TCP连接。在HTTP/2连接上,负载均衡器通过发送HTTP/2GOAWAY来正常启动这些连接的关闭。根据RFC 7540,"GOAWAY允许端点优雅地停止接受新流,同时仍完成对先前建立的流的处理“。客户端应通过完成正在进行的请求、关闭连接并在需要时重新连接来响应。应用程序负载均衡器将在访问日志中记录每个请求的HTTP状态,而不是连接状态关闭信号。

应检查由于收到HTTP/2 GOAWAY而出现错误的客户端,以确保它们完全符合HTTP/2 RFC。

有关HTTP/2 GOAWAY方法的更多信息,请参阅RFC7540的第6.8节。https://www.rfc-editor.org/rfc/rfc7540#section-6.8

如果您对弹性负载均衡器的此行为或其他行为有任何进一步的问题,请让我们知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41592929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档