Error : too_many_pings error in gRPC service calls

Error : too_many_pings error in gRPC service calls

grpc 中的 too_many_pings 错误是什么?

  1. 这些错误只是从服务器端到客户端,还是在某些用例中客户端也可以将其发送到服务器(我知道这很奇怪!但万一存在任何用例!!)

  2. 服务器是在这个错误后断开通道还是仍然准备好接收请求?

如何避免?避免它是个好主意吗?

提前致谢, 尼洛帕尔

有关详细信息,请参阅此 https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md#server-enforcement

  1. 是的,仅从服务器到客户端。没有客户端到服务器的用例。

  2. 是,根据 https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md#server-enforcement

我认为避免客户端发送过多的 ping 是个好主意。在 Java 中你可以使用 ManagedChannelBuilder.keepAliveTime().

这是为了防止 grpc 客户端流保持连接,即使流中没有数据移动。 当流处于活动状态且没有数据移动时,客户端会继续 ping 服务器以了解其是否处于活动状态!从服务器的角度来看,这些连续的 ping 请求基本上是滥用。当检测到此类失效连接时,服务器会发送此错误并中断与客户端的连接,客户端无法进一步通信或发送任何请求。

但肯定会出现一些用例,即使没有传入请求,客户端也希望保持连接数小时。基本上是一个陈旧的流。

在这些情况下,客户端和服务器都必须自行配置以允许此类 HTTP/2 Pings!!

服务器强制执行

**Servers will have two settings for enforcement:**

PERMIT_KEEPALIVE_TIME, defaulting to 5 minutes
PERMIT_KEEPALIVE_WITHOUT_CALLS to true

**The client options can be specified** via ManagedChannelBuilder.keepAliveTime(), keepAliveTimeout(), and keepAliveWithoutCalls()

详细文档可以参考上面的post,@San P的github link.