使用Netty对HTTP / 2中的流进行节流读取

时间:2019-06-14 16:09:32

标签: java netty

在Netty 4中,proxy example的AUTO_READ已关闭,根据this answer,这是为了使向代理发送大量数据的通道不会占用过多的缓冲区,这很有意义

但是,我的理解是,在HTTP / 2中,您永远不应延迟读取,而应该逐流处理流控制。不过,我不知道如何在Netty中做到这一点。

感觉应该通过在onDataRead上的Http2ConnectionHandler中返回0来实现。以下人为设计的示例是我预期的工作方式,其中100ms的字节未消耗:

@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在异常处理方面也有足够的逻辑,我真的不想重新实现它。那么如何使用Netty限制HTTP / 2中的流读取?

0 个答案:

没有答案