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つが間違っていますか?
どうもありがとうございました!