Async Netty HttpServer和HttpClient

时间:2013-05-23 14:33:21

标签: http netty

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

我的下一步是作为请求处理的一部分,我需要向外部Web服务器发起HTTP请求。我的直觉是实现一个可以同时发送大量请求的异步客户端,但我有点困惑,因为什么是正确的方法。我的理解是,Netty服务器为每个传入消息使用一个工作线程,因此在我的处理程序完成其工作之前,该工作线程不会被释放以接受新消息。 下面是冲击:即使我手头有异步HTTP客户端,如果我需要等待每个响应并使用我的服务器处理程序处理它也无关紧要 - 同一个工作线程将一直保持阻塞状态。另一种方法是使用客户端的异步特性,快速返回未来对象以释放线程并放置一个监听器(意味着我必须向客户端返回200或202状态),并检查我的未来对象以指示何时响应收到了,我可以把它推给客户。

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

谢谢,

1 个答案:

答案 0 :(得分: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消息,你可以做两件事来缓解这个问题,你已经在第一个已经发现了。

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

其次,您可以在自己的EventExecutorGroup中运行自定义处理程序,这意味着它在acceptor / 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);
    }
};

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