0

Netty を使用して、TCP 経由のプロトコルのサーバーとクライアントを実装しています。サーバー側では、リッスンするポートごとにクラス bootStrap と pipelineFactory のインスタンスを 1 つ作成しました。

ただし、クライアント側では、それを構造化する方法について明確な考えがありません。何千もの異なる宛先への何千もの接続を開く必要があります。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() を構成する必要があります。

  • 私の 2 番目のオプションは、ClientBootstrap のシングルトン インスタンスを使用することですが、送信クライアント接続ごとに新しい PipelineFactory を作成します。これは、pipelineFactory インスタンスでプロパティを設定できるため、パイプラインを構成するのに役立ちます。

  • 3 番目のオプションは、発信接続ごとに新しい bootStrap オブジェクトと pipelineFactory を作成することです。これにより、すべての接続で tcp.delay や​​ tcp.keepalive などのプロパティを構成し、接続メソッドで同期ブロックを削除できるようになり、クライアント接続が高速化される可能性があります。

最初のものは最速でメモリ使用量が最も少ないと思いますが、3番目のものは最も構成可能で開発が簡単かもしれません。

このアプローチの長所と短所についてアドバイスをいただけますか? 多分それらの1つが間違っていますか?

どうもありがとうございました!

4

1 に答える 1

1

ClientBootstrapインスタンスは安価です。接続ごとに新しいものを作成し、それらすべてにNioSocketClientChannelFactoryを再利用します。または、可能であれば、SSL接続用に1つのブートストラップを使用し、非SSL接続用に1つのブートストラップを使用することもできます。これにより、メモリのオーバーヘッドから保護されます。

于 2013-03-04T16:27:17.983 に答える