gpt4 book ai didi

java - Netty 上的 Singleton bootstrap 和 pipelineFactory 作为 Tcp 客户端

转载 作者:行者123 更新时间:2023-12-01 14:48:02 27 4
gpt4 key购买 nike

我正在使用 Netty 来实现 TCP 协议(protocol)的服务器和客户端。在服务器端,我为它监听的每个端口创建了类 bootStrap 和 pipelineFactory 的一个实例,并且它运行良好且快速。

但是在客户端,我还没有清楚地了解如何构建它。我需要打开与数千个不同目的地的数千个连接。我正在 Spring Framework 上开发该项目,因此我可以轻松创建单例 bean 并将它们作为属性注入(inject)。我正在评估 3 个选项:

  • 使用 ClientBootstrap 和 PipelineFactory 的单例实例。每个连接都使用如下代码来获取 channel :

    public Channel connect(final InetSocketAddress serverAddress, final ChannelPipelineFactory pipelineFactory, int timeout, TimeUnit unit) throws InterruptedException {
    ChannelFuture future;
    synchronized (bootstrap){
    bootstrap.setPipelineFactory(pipelineFactory);
    future = bootstrap.connect(serverAddress);
    future.addListener(new ChannelFutureListener() {
    @Override
    public void operationComplete(ChannelFuture future) throws Exception {
    if (future.isSuccess()) {
    //TODO set here some channelLocal properties I need to configure the session (eg: user, password etc...)
    }
    else{
    throw new RuntimeException(future.getCause()
    .getMessage());
    }
    }
    });
    }
    return future.getChannel();

    }

我的解决方案还必须能够配置管道以启用或禁用 SSL 或日志处理程序,也许可以使用此 Abe solution to configure getPipeline()

  • 我的第二个选择是使用 ClientBootstrap 的单例实例,但在每个传出客户端连接上创建一个新的 PipelineFactory。这有助于我配置管道,因为我可以在 pipelineFactory 实例上设置属性。

  • 第三个选项是在每个传出连接上创建新的 bootStrap 对象和 pipelineFactory。这允许我在每个连接上配置 tcp.delay 或 tcp.keepalive 等属性,并允许我删除连接方法上的同步块(synchronized block),这可以加快客户端连接速度。

我认为第一个是最快的并且使用最低的内存,但第三个是最可配置的并且可能易于开发。

您能给我一些关于这种方法的优缺点的建议吗?也许其中之一是错误的?

非常感谢!

最佳答案

ClientBootstrap 实例很便宜。我只需为每个连接创建一个新的连接,并为所有连接重用 NioSocketClientChannelFactory。或者,如果可以的话,您可能希望对 ssl 连接使用一种 Bootstrap ,对非 ssl 连接使用一种 Bootstrap 。这将使您避免一些内存开销。

关于java - Netty 上的 Singleton bootstrap 和 pipelineFactory 作为 Tcp 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15204818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com