使用 Netty 和 NIO 实现高并发 HTTP

2023-11-24

我正在通过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实例。一旦您拥有该通道,只要它处于打开状态,您就不需要创建另一个引导程序。 (如果这就是你正在做的事情。)

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

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

// 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(String 主机,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();
    }
});

所以,基本上,我只保留一个参考bootstrap and channel,但是前者在这些代码行之外几乎不被使用。

Note:你应该只执行bootstrap.releaseExternalResources();当应用程序退出时一次。就我而言,客户端发送一些文件,然后关闭通道并退出。

一旦您建立了连接Channel例如,你只需要使用那个,直到你再次关闭它。关闭后,您可以调用bootstrap创建一个新的Channel again.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Netty 和 NIO 实现高并发 HTTP 的相关文章

随机推荐

  • 如何观察ng-content中input元素的变化

    当子组件观察到输入变化时如何调用父组件的函数 下面是 HTML 结构 app comopnent html
  • pandas DataFrame 单列中的多个值

    我正在将一些数据从 XML 解析为 pandas DataFrame XML 数据大致如下所示
  • PHP 中的 HTTP if-none-match 和 if-modified-since 以及 304 说明

    我的问题是当我收到 HTTP 304 未修改 时如何回复bothif none match 和 if modified since 来自代理 客户端请求 来自 RFC 2616 第 14 26 节 http www w3 org Proto
  • 如何对齐两个 y 轴刻度的网格线?

    我正在 y 轴上绘制两个具有不同单位的数据集 有没有办法让刻度线和网格线在两个 y 轴上对齐 第一张图片显示了我得到的东西 第二张图片显示了我想要得到的东西 这是我用来绘制的代码 import seaborn as sns import n
  • 如何缩短 List>>?

    我想在轻量级结构中存储键值对列表的列表 这似乎太麻烦了 什么更好 List gt 会增加很多开销吗 还有哪些其他选择 考虑使用别名作为简写 namespace Application using MyList List
  • 在 Ubuntu 上编译 Fortran netCDF 程序

    好的 这里是新手问题 我正在尝试编译simple xy wr f90 一个 netCDF 示例程序 在 Ubuntu 上使用 gfortran 我一定做了一些非常愚蠢的事情 我没有太多编译 Fortran 的经验 首先 我有libnetcd
  • 如何使用 jQuery 预选选择框中的选项

    我有一个带有各种选项的选择框 当页面加载时 应该使用 jQuery 预先选择一个带有值的选项 例如 10 我怎样才能做到这一点 当页面加载时运行这个 你可以把它放在 option value 10 attr selected selecte
  • 导入和类型:模块的 prisma db 种子和打字稿问题

    我从本教程中学习了 prisma https www prisma io blog fullstack nextjs graphql prisma oklidw1rhw 我的步骤有问题 npx prisma db seed preview
  • 如何在asp.net中发送http请求而不等待响应并且不占用资源

    在 ASP Net 应用程序中 我需要通过 http POST 将一些数据 urlEncodedUserInput 发送到外部服务器以响应用户输入 而不阻止页面响应 其他服务器的响应是什么并不重要 我也不关心请求有时是否失败 这似乎运行良好
  • 在启动时加载 .Rprofile

    我有一个全球 Rprofile文件和另一个 Rprofile文件位于我的项目的当前工作目录中 两者都具有以下内容 First lt function options rstudio markdownToHTML function input
  • Snowflake没有实现完整的SQL MERGE语句?

    我正在尝试创建一个执行 MERGE 语句的 Snowflake 任务 然而 Snowflake 似乎不识别 当与目标不匹配时 或 当与源不匹配时 语句 create or replace task MERGE TEAM TOUCHPOINT
  • paramiko Channel.recv() 究竟是如何工作的?

    我很难理解如何recv 功能有效 http docs paramiko org en 1 13 api channel html paramiko channel Channel recv 我知道每次调用该函数时都会接收一个数据块 但是有人
  • 如何防止在 Windows Phone 8.1 中按 Home 键时关闭 ContentDialog?

    private IAsyncOperation
  • LogStash:如何在保持相同时间格式的同时复制@timestamp字段?

    我想创建一个副本 timestamp字段 使其使用与以下内容相同的格式 timestamp 我尝试过以下方法 mutate add field gt read time timestamp 但同时 timestamp格式为 2014 08
  • 如何从另一个渲染组件/助手?

    我有渲染组件 source 用于从控制器字段渲染组件 助手 它在 ember 1 9 1 上运行良好 但在更新到 ember 1 12 1 后 我发现 API 发生了变化 后更新代码我恢复简单的情况 例如按某些属性的名称渲染视图 但大部分功
  • 子类化具有 xib 的子类 UIViewController

    我需要有一些看起来非常相似但具有不同行为的 UIViewController 所以我想我应该使用 xib 创建一个通用 UIViewController 子类 然后在需要时将其子类化 以适应那些看起来相似的不同 UIViewControll
  • Razor 查看动态表行

    我希望在我的视图中有一个表格 将模型中的 3 个元素放入每行中 因此 我要做的方法是循环遍历模型 并在 foreach 循环内部检查我设置的计数变量 如果 count mod 3 0 我会做类似的事情 tr 开始一个新行 这没有按照我想要的
  • Python创建一个空的稀疏矩阵

    我正在尝试将一些真实数据解析为 mat要加载到我的对象matlab script 我收到此错误 类型错误 coo matrix 对象不支持项目分配 I found 酷矩阵 但是 我无法为其赋值 data txt 10 45 11 12 4
  • 从 ggplot2 中删除网格、背景颜色以及顶部和右侧边框

    我想使用 ggplot2 重现下面的图 我可以接近 但无法删除顶部和右侧边框 下面我展示了使用 ggplot2 的一些尝试 包括在 Stackoverflow 上或通过 Stackoverflow 找到的一些建议 不幸的是 我无法让这些建议
  • 使用 Netty 和 NIO 实现高并发 HTTP

    我正在通过Netty HTTP 客户端代码示例为了在并发 线程环境中发出 http 请求 然而 我的系统在吞吐量相当低的情况下完全崩溃了 有很多例外 几乎是伪代码 ClientBootstrap bootstrap new ClientBo