Клиент gRPC Android теряет соединение "слишком много пингов" - PullRequest
0 голосов
/ 20 декабря 2018

Android-клиент grpc получает GOAWAY с сервера с ошибкой «слишком много пингов».Теперь я понимаю, что это, вероятно, проблема на стороне сервера, но я думаю, что проблема заключается в том, что настройки канала клиента не совпадают с настройками серверов.

У меня есть сервер 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()

Через несколько минут (хотя, кажется, случайное время).Я получаю ошибку.Я заметил, что если я передаю данные по вызову, то ошибка никогда не происходит.Это только когда нет данных в потоке.Это заставляет меня поверить, что проблема в том, что GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA необходимо также установить на клиенте Android.Проблема заключается в моей жизни, я не могу найти, где установить эти настройки канала на gRPC Java.Может кто-нибудь указать мне, где я могу установить эти настройки канала?Там нет примеров, где они были установлены.

1 Ответ

0 голосов
/ 20 декабря 2018

Указанные параметры канала используют неправильные имена.Такие имена, как GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA, являются C-определениями для таких вещей, как "grpc.http2.max_pings_without_data".

. Вы можете отобразить имя C на строку ключа, посмотрев на grpc_types.h .Вы должны предпочесть использовать одну из констант C # в ChannelOptions, когда она доступна, но в данном случае это не представляется возможным.

Эти параметры не видны в API Java ManagedChannelBuilder, потому что ониспецифичные для сервера настройкиТаким образом, вместо этого они видны на ServerBuilder.См. A8 на клиентской стороне keepalive для ссылки на Java keepalive API.

...