Asp.net core AWS ALB上的HTTP2 PING帧(gRPC保持PING)

Asp.net core AWS ALB上的HTTP2 PING帧(gRPC保持PING),asp.net-core,grpc,http2,keep-alive,aws-application-load-balancer,Asp.net Core,Grpc,Http2,Keep Alive,Aws Application Load Balancer,我正在使用AWS应用程序负载平衡器(ALB)公开ASP.NET核心gRPC服务。这些服务在Fargate容器中运行,并公开不安全的HTTP端口。ALB终止外部TLS连接,并根据路由将未加密的流量转发给目标组。gRPC应用程序有多个客户端流式处理端点,客户端可以暂停流式处理几分钟。我知道有一些HTTP2 PING帧可以在这种情况下使用,以保持连接在一段时间内没有数据传输 gRPC服务器被配置为每20秒发送一次HTTP2 ping,以保持连接处于活动状态。我测试了这种方法,它工作了,ping帧从服务

我正在使用AWS应用程序负载平衡器(ALB)公开ASP.NET核心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的grpcapi。对于服务器到客户端,您需要使用服务器端流式API。但实际上,最好让客户端启动ping,以减少服务器必须执行的工作。

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

如前所述,可能的解决方法是定义一个gRPC API来执行ping。

ALB支持gRPC,奇怪的是他们不支持ping。