1

Java で Stomp プロトコル クライアントを作成していますが、IO を処理するスレッドが 1 つしかありません。これは、スレッドが受信データをアプリケーションに読み書きすることを意味します。私の問題は、将来、マルチスレッドと NIO を使用してこのアプリケーションをスケーリングする必要がある場合、どのように調整できるかということです。

私のIOプロセッサスレッドは「TcpLink」リンクと呼ばれ、次の骨格があります

    class TcpLink implements Runnable {

         public void run() {
            // read data from socket and assign it to  a byte buffer
            // notify the listening application
         }
   }

複数のスレッドが着信メッセージをディスパッチできるようにする必要がある場合、このクラスをどのように変更する必要がありますか?

ありがとう!

4

2 に答える 2

2

Java NIO に基づくスケーラブルなシステムの設計に関するDoug Lee のプレゼンテーションがとても気に入っています。

本質的に、設計は通常、単一の I/O スレッドが多数のクライアント接続をラウンドロビンするReactor パターンに基づいています。I/O スレッドが飽和状態になった場合は、マスター リアクターから 1 つまたは複数の子リアクターへの接続をオフにすることを検討できます。独自のスレッドを含む各リアクター。

設計で注意すべきもう 1 つの重要な点は、I/O スレッドは I/O のみを実行する必要があり、通常は受信メッセージを別のスレッド (例: ExecutorService) にディスパッチして実際の作業を行う必要があることです。これにより、特定のメッセージが処理されている間、他の接続で I/O が枯渇するのを防ぎます。

于 2010-01-21T17:32:35.410 に答える
1

TcpLink クラスのリストを管理するラッパー クラスを作成することをお勧めします。ラッパー クラスの役割は、着信メッセージを受信し、それを待機中/少数の TcpLink インスタンスに割り当てることです。スループット/TPS を計算し、必要なときに新しいインスタンスを作成できます。ここでは、1 つの読み取り対象になるように、1 つのみを作成します。

于 2010-01-21T17:32:44.137 に答える