-2

新しいブートストラップを作成するのはなぜそんなにぎこちなく見えるのでしょうか? これを通常よりも簡単に行う方法があるはずです

serverBootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
    Executors.newCachedThreadPool(),
    Executors.newCachedThreadPool()));

見た目は絶対に恐ろしいです。同様に、なぜ newCachedThreadPool() を 2 回呼び出さなければならないのですか?

4

1 に答える 1

0

Netty の最近のバージョンでは、NioServerSocketChannelFactory現在行っているように 2 つのキャッシュされたスレッド プールを使用するデフォルトのコンストラクターを使用できます。ブーストラップのインスタンス化は次のようになります。

ServerBootstrap sb = new ServerBootstrap(new NioServerSocketChannelFactory());

ただし、これらのスレッド プールの用途を調べてください。特定の条件下 (スローロリス攻撃など) では、このセットアップはうまく機能せず、代わりに Java プロセスがヒープ領域を使い果たす原因となります。このため、Netty が提供するMemoryAwareThreadPoolExecutorクラスを調べることができます。

キャッシュされたスレッド プールは、"クリティカル マス" に達するポイントがあるため、本質的に悪です。これは、スレッド数が非常に多い場合にコンテキスト切り替えのオーバーヘッドが原因でパフォーマンスが低下する状況です。スレッド数が原因でパフォーマンスが低下するにつれて、スレッド プール ワーカーのタスクの完了が遅くなります。これらのワーカーは長時間ビジーであるため、キャッシュされたスレッド プールは継続的な作業負荷を処理するために新しいスレッドを作成し続ける必要があります。より多くのスレッドが作成されると、パフォーマンスはさらに低下し続けます。問題はそれ自体に寄与し、サーバーは本質的に爆発します。楽しむ!

于 2012-08-15T22:36:38.757 に答える