【问题标题】:HTTP2 PING frames over AWS ALB (gRPC keepalive ping)AWS ALB 上的 HTTP2 PING 帧(gRPC keepalive ping)
【发布时间】:2021-06-23 09:11:37
【问题描述】:

我正在使用 AWS Application Load Balancer (ALB) 来公开 ASP.NET Core gRPC 服务。这些服务在 Fargate 容器中运行并公开不安全的 HTTP 端口。 ALB 终止外部 TLS 连接并根据路由将未加密的流量转发到目标组。 gRPC 应用程序有多个客户端流式传输端点,客户端可以暂停流式传输几分钟。我知道有 HTTP2 PING 帧,可以在这种情况下使用,以在一段时间内保持没有数据传输的连接。

gRPC 服务器配置为每 20 秒发送一次 HTTP2 ping 以保持连接处于活动状态。我测试了这种方法并且它有效,ping 帧来自服务器并被客户端确认。 但是当涉及到 ALB 时,这种方法就失败了。在传输暂停期间,我没有看到来自负载均衡器后面的服务器的任何包(我使用 Wireshark)。然后在超时 1 分钟后,ALB 重置连接。

我也尝试使用客户端发送的 HTTP2 ping。但是连接也会在 1 分钟内重置,我没有证据表明这些 ping 包是否真的到达了 ALB 后面的服务器。 我假设 AWS ALB 不允许此类数据包通过它,但我没有找到任何证明这一点的文档。

【问题讨论】:

标签: asp.net-core grpc http2 keep-alive aws-application-load-balancer


【解决方案1】:

ALB 基于 HTTP 协议语义而不是原始 HTTP/2 帧转发请求。因此,诸如 ping 帧之类的内容仅适用于其中一个跃点。

如果您想要端到端 ping,您可以定义一个执行 ping 的 gRPC API。对于服务器到客户端,您将需要使用服务器端流 API。但实际上最好让客户端启动 ping,以减少服务器必须执行的工作。

【讨论】:

    【解决方案2】:

    AWS 支持团队回复了我的请求,简短的回答是 ALB 不支持 HTTP2 ping 帧。他们建议增加负载均衡器上的空闲超时值,但这种解决方案在某些情况下可能不适用。

    正如Matthias247 已经提到的,可能的解决方法是定义一个 gRPC API 来执行 ping。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-28
      • 2018-03-24
      • 2014-06-07
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2020-09-18
      • 2020-08-19
      相关资源
      最近更新 更多