0

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

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

  • 使用 ClientBootstrap 和 PipelineFactory 的单例实例。每个连接都使用这样的代码来获取通道:

    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 解决方案来配置 getPipeline()

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

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

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

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

非常感谢你!

4

1 回答 1

1

ClientBootstrap 实例很便宜。我会为每个连接创建一个新的连接,并为所有连接重用 NioSocketClientChannelFactory。或者,如果可以的话,您可能希望将一个引导程序用于 ssl 连接,而将一个引导程序用于非 ssl。这将使您免受一些内存开销。

于 2013-03-04T16:27:17.983 回答