Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有Netty和NIO的高度并发HTTP_Java_Http_Concurrency_Clojure_Netty - Fatal编程技术网

Java 具有Netty和NIO的高度并发HTTP

Java 具有Netty和NIO的高度并发HTTP,java,http,concurrency,clojure,netty,Java,Http,Concurrency,Clojure,Netty,为了在并发、线程化环境中发出http请求,我正在处理 然而,我的系统在相当低的吞吐量下完全崩溃(有大量异常) 在几乎所有的伪代码中: ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory()) bootstrap.setPipelineFactory(new HttpClientPipelineFactory()); ChannelFuture future = bootstrap.

为了在并发、线程化环境中发出http请求,我正在处理

然而,我的系统在相当低的吞吐量下完全崩溃(有大量异常)

在几乎所有的伪代码中:

ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory()) 
bootstrap.setPipelineFactory(new HttpClientPipelineFactory());

ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
Channel channel = future.awaitUninterruptibly().getChannel();

HttpRequest request = new DefaultHttpRequest();
channel.write(request);
在本例中,为了发出请求,我创建了一个ClientBootstrap,并从那里(通过几个环)创建了一个通道来编写HTTPRequest

这一切都是好的

然而,在同时发生的情况下,每个请求是否都应该经历相同的过程?我想这正是我目前面临的问题。我应该以完全不同的方式重用连接还是构建我的客户机


另外:我在Clojure做这件事,如果这有什么不同的话

不,你做得对。但是,您必须保留对
频道
实例的引用。一旦你有了那个频道,只要它是开放的,你就不需要再创建另一个引导。(如果你是这么做的。)

这是我在最近的一个项目中使用的:

类客户端连接(构造函数)

类ClientConnection.connect(字符串主机,int端口)

因此,基本上,我只保留了对
bootstrap
channel
的引用,但是前者在这些代码行之外几乎没有使用

注意:您应该只执行
bootstrap.releaseExternalResources()一次,当应用程序退出时。在我的例子中,客户端发送一些文件,然后关闭通道并退出

一旦您连接了一个
频道
实例,您只需使用该实例,直到再次关闭它。关闭后,您可以调用
引导
,再次创建新的
频道


就我个人而言,一开始我觉得Netty有点难以理解,但一旦你掌握了它的工作原理,它就是Java中最好的NIO框架。IMO.

Netty是在JVM中编写高度并发HTTP服务的最佳方法,但它非常复杂,很难直接进行互操作,尤其是在使用Clojure时。看一看驴,它提供了与Vert.x的互操作,Vert.x使用Netty作为后端。这种分层抽象了很多细微的低级细节,若做得不对,可能会导致服务不稳定。驴是相对较新的,所以还没有很多关于它的文档。看看这篇文章,它的特色是一个开源项目,它使用驴在Clojure中实现了一个基本的新闻提要微服务。它详细介绍了体系结构、设计、编码和负载下的性能。

也许您应该使用?您有使用aleph的经验吗?我尝试了另一个async clojure http客户端,但它不能以我需要维持的吞吐量水平工作。
bootstrap
如果您想建立另一个连接并利用现有的机器(底层的Netty NIO工作线程),它也会很有用。
// Configure the client.
bootstrap = new ClientBootstrap(
    new NioClientSocketChannelFactory(
        Executors.newCachedThreadPool(),
        Executors.newCachedThreadPool()
    )
);

// Set up the pipeline factory.
bootstrap.setPipelineFactory(
    new ChannelPipelineFactory() {
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                // put your handlers here
            );
        }
    }
);
if (isConnected()) {
    throw new IllegalStateException("already connected");
}

// Start the connection attempt.
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));

channel = future.awaitUninterruptibly().getChannel();

// Wait until the connection is closed or the connection attempt fails.
channel.getCloseFuture().addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture future) throws Exception {
        new Thread(new Runnable() {
            public void run() {
                // Shut down thread pools to exit
                // (cannot be executed in the same thread pool!
                bootstrap.releaseExternalResources();

                LOG.log(Level.INFO, "Shutting down");
            }
        }).start();
    }
});