繁体   English   中英

Netty上的Singleton Bootstrap和PipelineFactory作为Tcp客户端

[英]Singleton bootstrap and pipelineFactory on Netty as Tcp Client

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

但是在客户端,我对如何组织它还没有一个清晰的想法。 我需要打开与数千个不同目的地的数千个连接。 我正在Spring框架上开发项目,因此我可以轻松创建单例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之类的属性,并允许我删除connect方法上的同步块,这可以加快客户端连接的速度。

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

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

非常感谢你!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM