我们最近从ELB切换到ELB2 / ALB,偶尔我们的http / 2客户端会看到来自我们的应用程序负载均衡器的GOAWAY消息,我无法解释。目标组服务器仅支持http / 1.1,我们的负载均衡器应始终至少有一台正常运行的服务器。
在ALB中注册新实例时,我可以可靠地重现GOAWAY。当目标位于"初始"时,ALB返回GOAWAY。州。此外,即使ALB以GOAWAY响应,该请求也成功地使其成为在目标组中注册的另一个实例。因此,给定实例web0和web1,如果我取消注册web0并重新注册该目标,如果我在web0处于" Initial"时发出请求,我可以可靠地重现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=""
我想更好地了解这里发生了什么。应该去http2包或我们的代码通过重试请求自动处理GOAWAY?我对http2不熟悉,不知道是否需要GOAWAY,这意味着我们的Go客户端不应该将其作为错误条件处理,或者如果这表明ALB出现了问题。
答案 0 :(得分:4)
<template>
<require from="./element1"></require>
<element1>
<p slot="1">sadfasdf</p>
<p slot="2">asdfsadfasd</p>
</element1>
</template>
框架包含三条可帮助您解决问题的信息:
GOAWAY
+-+-------------------------------------------------------------+
|R| Last-Stream-ID (31) |
+-+-------------------------------------------------------------+
| Error Code (32) |
+---------------------------------------------------------------+
| Additional Debug Data (*) |
+---------------------------------------------------------------+
帧GOAWAY
和Last-Stream-ID
,让客户端知道即将关闭,然后在一段时间后,发送另一个NO_ERROR
帧,并将GOAWAY
设置为实际上次处理的ID。这样客户就知道传递了什么。这是来自RFC7540, 6.8 GOAWAY 尝试正常关闭连接的服务器 应该发送一个带有最后一个流标识符的初始GOAWAY帧 设置为2 ^ 31-1和NO_ERROR代码。这向客户发出信号 即将关闭,并且启动进一步的请求 禁止。在为任何飞行中的流创建留出时间之后 (至少一次往返时间),服务器可以发送另一个GOAWAY 具有更新的最后流标识符的帧。这确保了 连接可以干净地关闭而不会丢失请求。
Last-Stream-ID
。 found an upper-case letter in header name
由于服务器正在发送http2: server sent GOAWAY and closed the connection; LastStreamID=1, ErrCode=NO_ERROR, debug=""
,您的客户端应该只是尝试重新连接,而不是将消息视为错误。
关于为什么 ALB正在发送GOAWAY ...我不确定,你能否提供更多详细信息?
答案 1 :(得分:0)
@ frederik-deweerdt应该接受答案,特别是有关应用程序负载均衡器的答案,以下是针对类似问题的AWS论坛帖子的回答,https://forums.aws.amazon.com/thread.jspa?messageID=771883򼜫
您的客户端正在接收的HTTP / 2 GOAWAY响应是由Application Load Balancer正常关闭的连接。应用程序负载均衡器通常允许空闲连接持续到配置的空闲超时,其默认值为60秒。但是,有一些条件可以触发空闲连接的关闭。在HTTP / 1.1连接上,允许完成未完成的请求,然后正常拆除TCP连接。在HTTP / 2连接上,负载均衡器通过发送HTTP / 2 GOAWAY来优雅地启动这些连接的关闭。根据RFC 7540“GOAWAY允许端点优雅地停止接受新流,同时仍然完成先前建立的流的处理”。客户端应通过完成进行中的请求,关闭连接并在需要时重新连接来做出响应。应用程序负载均衡器将记录访问日志中每个请求的HTTP状态,而不是连接状态关闭信号。
应检查因收到HTTP / 2 GOAWAY而遇到错误的客户,以确保他们完全符合HTTP / 2 RFC。
您可以在RFC 7540的第6.8节中阅读有关HTTP / 2 GOAWAY方法的更多信息。 https://tools.ietf.org/html/rfc7540#section-6.8
如果您对Elastic Load Balancers的此行为或其他行为有任何疑问,请告诉我们。