私は、いくつか (数百) のリモート ピアに接続 (および維持) し、それらのメッセージング/制御を管理する必要があるプロセスを作成しています。
私はこのソフトウェアの 2 つのバージョンを作成しました。最初は従来の「接続ごとのスレッド」モデルを使用し、2 つ目は標準の Java NIO とセレクターを使用しました (スレッドの割り当てを減らすためですが、問題があります)。それから、周りを見回すと、ほとんどの場合 Netty が大幅にブーストできることがわかり、それを使用して 3 番目のものを開始しました。私の目標は、リソースの使用率を非常に低く保ち、高速に保つことです。
カスタム イベントと動的なハンドラーの切り替えを使用してパイプライン ファクトリを記述したら、最も表面的な部分であるその割り当てにとどまりました。私が読んだすべての例は、単一の接続で単一のクライアントを使用しているため、疑問が生じました。共有パイプラインを作成し、ビジネス ロジックをスレッド プールに任せることは可能ですか? ChannelFactory
PipelineFactory
(new ClientBootstrap(factory)).connect(address)
もしそうなら、どのように?
標準の Java NIO を使用して、セレクターを利用して 2 つの小さな小さなスレッド プール (スレッド < リモート ピア) を使用することができました。ただし、リッスンしたチャネルを書き込み用にリサイクルする際に問題がありました。
通信は、リモート ピアから時間指定されたメッセージを受信したり、3 方向の制御 (command-ack-ok) を行ったりできる単一のチャネルを介して行われる必要があります。
一方で、イベントが最後のハンドラーに到達すると、何が起こるでしょうか? 抽出する場所はありますか、それとも任意のポイントからメッセージを抽出できますか?