2

永続的な TCP 接続を使用して、単一のクライアントが任意の数のサーバーに接続されるクライアント サーバー関係を作成しています。サーバーの実際の数はまだ決定されていませんが、設計目標は 1000 を目指すことです。

これがどのように機能するかについての私のメンタル モデルとほぼ完全に一致する、ダイレクト Java NIO を使用した例を見つけました。

http://drdobbs.com/jvm/184406242

一般に、すべてのチャネルを開き、java.nio.channels.Selector を監視する単一のスレッドにそれらを追加します。特に、セレクターを使用すると、標準のチャネルごとのスレッドを使用するよりもはるかに優れたスケーリングが可能になります。

直接の Java NIO よりも、Netty のような (わずかに) 高レベルのソケット フレームワークを使用したいと考えています。残念ながら、Netty がこのようなケースをどのように処理するかを判断できませんでした。つまり、私が見つけた例と議論はすべて、多数の同時接続を受け入れて、サーバー側に集中する傾向があります。

しかし、クライアント側からこれを行うにはどうすればよいでしょうか? 多数のチャネルを作成し、それらのイベントを待つだけの場合、Netty はバックエンドでこれをどのように処理しますか?

4

3 に答える 3

4

これはあなたの質問に対する直接的な回答ではありませんが、参考になれば幸いです。以下に、探している答えを特定する方法を説明します。これは、私が最近、次のプロジェクトのために自分で行ったことです。

OIO (旧 IO) と比較して、Netty フレームワークと NIO の非同期の性質により、アプリケーションのメモリと CPU の使用特性が大幅に向上します。Netty でのバッファーの処理方法も、バイト バッファーのコピーを回避するのに役立つため、有益です。ポイントは、すべてのスレッド プールと NIO の詳細が処理され、ビジネス ロジックに集中できるようになることです。あなたはNIOセレクターについて言及しましたが、それから恩恵を受けるでしょう。Netty の優れた点は、その実装が既に行われているため、自分でその実装について心配する必要なく利益を得られることです。

クライアント側についての私の理解では、クライアント側はサーバー側と非常に似ており、それに見合ったパフォーマンスの向上が得られるはずです (ビジネス ロジックがパフォーマンスの問題を引き起こさない限り)。

私のアドバイスは、多かれ少なかれあなたが望むことをするプロトタイプを一緒に投げることです. 時間のかかる詳細は省き、機能するものを作成するために必要な基本的な Netty ハンドラーを追加するだけです。

次に、jmeterを使用してクライアントを呼び出し、サーバーとクライアントに負荷をかけます。jconsolejvisualvmなどを使用すると、負荷がかかっているクライアントとサーバーのパフォーマンス特性が表示されます。jprobeを試すこともできます。スループットを示すリスナーを jmeter に追加できます。サーバーモードでjmeterを使用し、クライアントを別のマシンで、サーバーをさらに別のマシンで使用することをお勧めします。これは少し前もっての作業ですが、先に進むことにした場合は、これらのツールを準備してさらにテストを進めることができます。

無関係なパフォーマンスの低いコンポーネントを導入しない適切な Netty 実装により、探しているパフォーマンス特性が得られると思いますが、確実に知る唯一の方法は、予想される負荷の下でシステムを測定することです。

予想される負荷がどのように見えるか、およびそのような負荷の下で望ましいパフォーマンス特性を定義する必要があります。これらの入力が与えられれば、システムを測定して、期待に応えられるかどうかを調べることができます。個人的には、それが望ましい方法で動作するかどうかは誰にも言えないと思います。あなたはそれを測定する必要があります。システムがニーズを満たすことができるかどうかを確認する唯一の信頼できる方法です。

直接の Java NIO よりも、Netty のような (わずかに) 高レベルのソケット フレームワークを使用したいと考えています。

これが正しいアプローチです。独自の NIO サーバーとクライアントを実装してみることができますが、高度に洗練されたフレームワークの利点をすぐに利用できるのに、なぜそれを行うのでしょうか?

于 2012-04-04T04:24:58.150 に答える
2

Netty は、作業を処理する最大 x 個のワーカー スレッドを使用します。各ワーカー スレッドには、チャネルを登録するために使用される 1 つのセレクターがあります。使用されるワーカーの数は構成可能で、デフォルトでは 2 * cpu-count です。

于 2012-04-04T06:10:17.927 に答える
1

Netty のドキュメント [http://netty.io/docs/stable/guide/html/#start.9][1] の例でわかるように、ワーカー スレッドの数を正確に制御できます (つまり、基礎となるスレッドの数を意味します)。セレクター) をクライアント側で使用します。Netty は、NIO と SSL など、単純な方法で処理するのが非常に難しい多くの問題を解決し、Zip 用のデフォルトのエンコーダー/デコーダーがたくさんあります... などです。私は数週間前に Netty を使い始めました。入ってすぐ。(すべてのサンプル コードを含むプロジェクトをダウンロードすることをお勧めします。上記の URL では見つからないドキュメントがたくさんあります。

            ChannelFactory factory = new NioClientSocketChannelFactory(
                      Executors.newCachedThreadPool(),
                      Executors.newCachedThreadPool());

            ClientBootstrap bootstrap = new ClientBootstrap(factory);

            bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
             public ChannelPipeline getPipeline() {
                    return Channels.pipeline(new TimeClientHandler());
             }
            });

            bootstrap.setOption("tcpNoDelay", true);
            bootstrap.setOption("keepAlive", true);

            bootstrap.connect(new InetSocketAddress(host, port));

幸運を、

ルノー

于 2012-04-04T12:13:14.433 に答える