0

过去几天我一直在探索 Netty,因为我正在编写一个快速而紧凑的 HTTP 服务器,它应该可以接收大量请求,而 Netty 的 HTTP 服务器实现非常简单并且可以完成这项工作。

我的下一步是作为请求处理的一部分,我需要向外部 Web 服务器发起 HTTP 请求。我的直觉是实现一个可以同时发送大量请求的异步客户端,但我有点困惑什么是正确的方法。我的理解是 Netty 服务器为每个传入消息使用一个工作线程,因此在我的处理程序完成工作之前,该工作线程不会被释放来接受新消息。重点是:即使我手头有一个异步 HTTP 客户端,我是否需要等待每个响应并使用我的服务器处理程序将其处理回来也没关系——同一个工作线程将一直处于阻塞状态。另一种方法是使用客户端的异步特性,

这有意义吗?我是否偏离了我的假设?实现这种具有高并发的Netty接受器服务器+外部客户端的好做法是什么?

谢谢,

4

1 回答 1

2

假设你问的是 Netty 4。

使用 ServerBootstrap 配置的 Netty 将具有固定数量的工作线程,用于接受请求并执行通道,如下所示:

Two threads accepting / processing requests
bootstrap.group(NioEventLoopGroup(2))

One thread accepting requests, two threads processing.
bootstrap.group(NioEventLoopGroup(1), NioEventLoopGroup(1))

在您的情况下,您有一个通道包括一堆 Http Codec 解码/编码内容和您自己的处理程序,该处理程序本身发出传出 Http 请求。您是对的,您不想阻止服务器接受传入的请求或解码传入的 Http 消息,您可以做两件事来缓解这种情况,您已经解决了第一件事。

首先,您想使用异步网络客户端发出传出请求,当传出请求返回时,让侦听器将响应写入原始请求通道。这意味着您不会阻塞和等待,这意味着您可以处理比可用于处理这些请求的线程数更多的并发传出请求。

其次,您可以让您的自定义处理程序在其自己的 EventExecutorGroup 中运行,这意味着它在与接受器/http 编解码器通道处理程序不同的线程池中运行,如下所示:

// Two separate threads to execute your outgoing requests..
EventExecutorGroup separateExecutorGroup new DefaultEventExecutorGroup(2);

bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
    @Override
    public void initChannel(SocketChannel ch) {
        ChannelPipeline pipeline = ch.pipeline();
        .... http codec stuff .... 
        pipeline.addLast(separateExecutorGroup, customHandler);
    }
};

这意味着您的传出请求不会占用用于接受/处理传入请求的线程。

于 2013-05-25T08:31:42.313 回答