AWS / ALB,http / 2和GOAWAY

时间:2017-01-11 14:02:03

标签: amazon-web-services go amazon-ec2 amazon-elb http2

我们最近从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出现了问题。

2 个答案:

答案 0 :(得分:4)

关于GOAWAY

<template> <require from="./element1"></require> <element1> <p slot="1">sadfasdf</p> <p slot="2">asdfsadfasd</p> </element1> </template> 框架包含三条可帮助您解决问题的信息:

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

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

  • 错误代码和其他调试数据(字符串)将包含解释正在进行的操作的其他信息。 RFC 7540, 7. Error Codes包含可能的错误代码列表。然后,根据服务器实现,您可能会有一个字符串缩小错误。在标题名称中找到大写字母时For example in H2O, the server sends Last-Stream-ID

这个特别的GOAWAY

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&#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的此行为或其他行为有任何疑问,请告诉我们。