【问题标题】:Async Netty HttpServer and HttpClient异步 Netty HttpServer 和 HttpClient
【发布时间】:2013-05-23 14:33:20
【问题描述】:

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

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

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

谢谢,

【问题讨论】:

    标签: http netty


    【解决方案1】:

    假设您询问的是 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);
        }
    };
    

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

    【讨论】:

    • 感谢您的回复。使用第一个选项,当侦听器处理响应时,正在使用哪个线程/线程池?而且,使用第二个选项,我实际上看到我可以决定在“关键/必须处理”哪些块和我不想阻止的其他逻辑之间划清界限 - 可以按照示例所示进行处理。我的理解正确吗?
    猜你喜欢
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多