当前位置: 首页 > 面试题库 >

与Netty和NIO高度并发的HTTP

琴镜
2023-03-14
问题内容

我正在研究示例Netty
HTTP客户端代码
,以便在并发线程环境中发出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,然后从那里(通过几个箍)创建一个Channel以编写HTTPRequest。

这一切都很好,而且很好。

但是,在同时发生的情况下,是否每个请求都要经过相同的循环?我认为这就是目前对我来说很重要的事情。我应该以完全不同的方式重用连接或构造客户吗?

另外:如果有任何区别,我正在Clojure中进行此操作。


问题答案:

不,您做对了。但是,您必须保留对Channel实例的引用。拥有该通道后,只要打开该通道,就无需创建另一个引导程序。(如果这就是您正在做的。)

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

ClientConnection类 (构造函数)

// 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
            );
        }
    }
);

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

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();
    }
});

因此,基本上,我只引用bootstrapchannel,但是在这些代码行之外几乎没有使用前者。

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

连接Channel实例后,只需使用该实例,直到再次关闭它。关闭后,您可以调用再次bootstrap创建一个新文件Channel

就个人而言,我发现Netty最初有点难以理解,但是一旦您掌握了它的工作原理,它就是Java中最好的NIO框架。海事组织。



 类似资料:
  • 本书从操作系统底层的IO原理入手讲解Java高并发核心编程知识,同时提供高性能开发的实战案例,是一本Java高并发编程的基础原理和实战图书。 本书共分为15章。第1~4章为高并发基础,浅显易懂地剖析高并发IO的底层原理,图文并茂地介绍Java异步回调模式,细致地讲解Reactor高性能模式。这些原理方面的基础知识非常重要,会为读者打下坚实的基础,也是日常开发Java后台应用时解决实际问题的金钥匙。

  • 我想在Netty nio中创建一个包含两个客户端和一个服务器的通信系统。更具体地说,首先,我希望当两个客户端与服务器连接时,从服务器发送消息,然后能够在两个客户端之间交换数据。我正在使用这个例子中提供的代码。我对代码的修改可以在这里找到:链接 似乎通道读取在服务器处理程序中工作,因此它始终返回 1,但当连接第二个客户端时,它不会更改为 2。当两个客户端都连接到服务器时,如何从服务器正确检查?如何从

  • 写入进程应该用bytebuffer触发,它填充另一个线程 系统必须意识到写入或读取操作,因为其中任何一个操作都可能首先发生。 一种防止cpu无用运行的方法,当不需要时,OP_write会使cpu忙起来。 答: 正确使用OP_WRITE的方法如下: 如果该写返回零,则为OP_WRITE注册通道,保存您试图写入的ByteBuffer,并在通道上激发OP_WRITE时返回select循环,如果该写成功且

  • 组件的高度和宽度决定了其在屏幕上显示的尺寸。 指定宽高 最简单的给组件设定尺寸的方式就是在样式中指定固定的 width 和 height 。React Native 中的尺寸都是无单位的,表示的是与设备像素密度无关的逻辑像素点。 export default class HelloWorld extends Component { render() { return ( <

  • 这对我来说可能很明显,但我仍然想确认以下几点... 给定一个特定的通道和一个NIO Netty服务器,它使用OrderedMemoryAwareThreadPoolExecutor和以下形式的客户端: null 首先,请让我知道,如果以上是不正确的。如果有,请指正。 对于断言3),服务器仍然按照每个事件接收的顺序处理请求,但是由于客户机是异步的,所以发送请求的顺序是无法预测的。真的吗? 因此,从客

  • 我使用Java nio编写了一个服务器(类似于这里的一个)和客户机代码。 我正在努力实现尽可能多的联系。根据之前的建议,我减缓了客户端创建过程,给操作系统(Windows 8)足够的时间来处理请求。 我在不同的机器上运行客户端代码,以便服务器拥有所有可用的运行空间。 当我尝试创建10000个连接时,大约8500个连接被连接,其余的连接被拒绝,客户端(客户端代码中的线程)的连接被拒绝的情况发生得更多