AWS ALB 上的 HTTP2 PING 帧gRPC keepalive ping

问题描述

我正在使用 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 不允许此类数据包通过它,但我没有找到任何证明这一点的文档。

解决方法

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

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

,

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

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