常時接続クライアント用の汎用サーバーを構築しようとしています。
アーキテクチャは 4 つの主要コンポーネントで構成されています
- ステートフル アプリケーション サーバー
- ステートレス ゲートウェイ サーバー
- クライアント
- キューイング システムとブローカー
プロセスフロー
- クライアントがゲートウェイに接続します
- ゲートウェイはセッション ID を受け入れてクライアントに送り返します
- クライアントはメッセージをゲートウェイに送信します
- ゲートウェイはリクエストをメッセージ/タスク キューに書き込みます
- デーモンはキュー上のメッセージを読み取り、アプリケーション サーバーのリッスン ソケットに転送します。
- アプリケーション サーバーは、ビジネス ロジックを通じてメッセージを実行します。
- その後、アプリケーション サーバーは関連するメッセージをクライアントに送信し、ゲートウェイ キューに入れます。
- ゲートウェイ上のスレッドは、受信キュー内のメッセージを読み取り、メッセージで識別されたメッセージをクライアントに送り返します。
- ゲートウェイは、受信メッセージをクライアント ソケットに転送するために、クライアント セッション ID のクライアント ソケット オブジェクトへのマップを維持します。
ゲートウェイに Java Netty を使用しています。アプリサーバーも Java です。
デザインが Mongrel2 に似ていると言いたくなるのですが、完全にはわかりません。これは、Urban Airship (http://urbanairship.com/blog/2010/08/24/c500k-in-action-at-urban-airship/) の Helium エッジ サーバー設計に沿ったものだと思います。
私の質問は次のとおりです: - 受信キューからメッセージを読み取り、クライアントに転送するためにスレッドを使用することは良い考えですか? これを処理するより良い方法はありますか?