android - gRPC Android 客户端失去连接“ping 太多”
问题描述
Android grpc 客户端从服务器接收 GOAWAY 并出现“ping 太多”错误。现在我意识到这可能是服务器端的问题,但我认为问题在于客户端通道设置与服务器的通道设置不匹配。
我有一个具有以下设置的 C# gRPC 服务器:
List<ChannelOption> channelOptions = new List<ChannelOption>();
channelOptions.Add(new
ChannelOption("GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS",
1000));
channelOptions.Add(new
ChannelOption("GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA", 0));
channelOptions.Add(new
ChannelOption("GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS", 1));
this.server = new Server(channelOptions) {
Services = { TerminalService.BindService(this) },
Ports = {new ServerPort("0.0.0.0", 5000,
ServerCredentials.Insecure)}
};
在 Android 上,我有以下频道设置:
private val channel = ManagedChannelBuilder.forAddress(name, port)
.usePlaintext()
.keepAliveTime(10, TimeUnit.SECONDS)
.keepAliveWithoutCalls(true)
.build()
几分钟后(但似乎是随机时间)。我得到了goaway错误。我注意到,如果我在通话中流式传输数据,那么错误就永远不会发生。仅当流上没有数据时。这让我相信问题是 GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA 也需要在 Android 客户端上设置。问题是我一生都找不到在 gRPC java 上设置这些通道设置的位置。有人可以指出我可以在哪里设置这些频道设置吗?没有设置这些的示例。
解决方案
指定的通道选项使用了错误的名称。GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA 之类的名称是"grpc.http2.max_pings_without_data"
.
您可以通过查看grpc_types.h从 C 名称映射到键字符串。您应该更喜欢在可用时使用其中一个 C# 常量ChannelOptions
,但在这种情况下,这似乎不是一个选项。
这些选项在 Java ManagedChannelBuilder API 中不可见,因为它们是特定于服务器的设置。因此,它们在 ServerBuilder 上可见。有关Java keepalive API 的参考,请参阅A8 客户端 keepalive 。
推荐阅读
- java - 具有最大 1 的 TLE 问题的行
- python - 比较采样器结合过采样和欠采样 ERROR
- scala - Scala 3 中的 @main 注解是如何工作的?
- flutter - 当我从提供者调用函数时,导航 2.0 没有路由
- typescript - 在泛型中使用泛型类类型
- javascript - 传递数组以通过 AJAX 解析
- kubernetes - 将动态供应的 PV 重新附加到 PVC
- kotlin - kaptKotlin 无法识别 micronaut 选项
- swift - 为什么单击 SwiftUI 中的列表项后列表视图项变灰?
- visual-studio - How to change the background color (without code windows) in Visual Studio 2019