Регулирование чтения потоков в HTTP / 2 с помощью Netty - PullRequest
2 голосов
/ 14 июня 2019

В Netty 4 пример прокси AUTO_READ выключен, что в соответствии с этот ответ так, что канал, отправляющий много данных на прокси-сервер не слишком израсходован много буферов, что имеет смысл.

Тем не менее, я понимаю, что в HTTP / 2 вы никогда не должны задерживать чтение, а вместо этого иметь дело с управлением потоком на основе потока за потоком. Я не могу понять, как это сделать в Netty.

Такое ощущение, что этого следует достичь, возвращая 0 в onDataRead на Http2ConnectionHandler. Следующий надуманный пример - это то, как я ожидал, что он будет работать, где байты не потребляются в течение 100 мс:

@Override
public int onDataRead(ChannelHandlerContext ctx, int streamId, ByteBuf data,
                      int padding, boolean endOfStream) throws Http2Exception {
    int processed = data.readableBytes() + padding;

    Http2LocalFlowController flowController = decoder().flowController();
    Http2Stream stream = connection().stream(streamId);
    executorService.schedule(() -> {
        ctx.executor().execute(() -> {
            try {
                // ...do stuff...
                flowController.consumeBytes(stream, processed);
            } catch (Http2Exception e) {
                e.printStackTrace(); // now what?
            }
        });
    }, 100, TimeUnit.MILLISECONDS);

    return 0;
}

Когда я использую это, исключение не выдается, и клиент просто отключается. Поэтому я предполагаю, что вызов consumeBytes не приводит к отправке WINDOW_UPDATE кадров. (Обратите внимание, что если я вызову вызов consumeBytes перед возвратом, т. Е. Не в другом потоке, он будет работать.)

Даже если это сработало, у DefaultHttp2ConnectionDecoder достаточно логики в обработке исключений, поэтому я не хочу его повторно реализовывать. Так как же вы регулируете чтение потока в HTTP / 2 с помощью Netty?

...