1

常時接続クライアント用の汎用サーバーを構築しようとしています。

アーキテクチャは 4 つの主要コンポーネントで構成されています

  • ステートフル アプリケーション サーバー
  • ステートレス ゲートウェイ サーバー
  • クライアントの待ち行列
  • システムとブローカー

プロセスフロー

  1. クライアントがゲートウェイに接続します
  2. ゲートウェイはセッション ID を受け入れてクライアントに送り返します
  3. クライアントはメッセージをゲートウェイに送信します
  4. ゲートウェイはリクエストをメッセージ/タスク キューに書き込みます
  5. デーモンはキュー上のメッセージを読み取り、アプリケーション サーバーのリッスン ソケットに転送します。
  6. アプリケーション サーバーは、ビジネス ロジックを通じてメッセージを実行します。
  7. その後、アプリケーション サーバーは関連するメッセージをクライアントに送信し、ゲートウェイ キューに入れます。
  8. ゲートウェイ上のスレッドは、受信キュー内のメッセージを読み取り、メッセージで識別されたメッセージをクライアントに送り返します。
  9. ゲートウェイは、受信メッセージをクライアント ソケットに転送するために、クライアント セッション ID のクライアント ソケット オブジェクトへのマップを維持します。

ゲートウェイに Java Netty を使用しています。アプリサーバーも Java です。

デザインが Mongrel2 に似ていると言いたくなるのですが、完全にはわかりません。これは、Urban Airship (http://urbanairship.com/blog/2010/08/24/c500k-in-action-at-urban-airship/) の Helium エッジ サーバー設計に沿ったものだと思います。

私の質問は次のとおりです: - 受信キューからメッセージを読み取り、クライアントに転送するためにスレッドを使用することは良い考えですか? これを処理するより良い方法はありますか?別のスレッドを使用せずに、メッセージがそれぞれのクライアント ソケットに送信されるようにするにはどうすればよいですか?

4

1 に答える 1

3

VM 内メッセージングを使用できます。これは、この種のアクター モデルを既に使用しているnetty ゲーム サーバー(注意! 私が書いたものです!) です。イベントのディスパッチとセッションに JetLang を使用して、クライアントへの各接続を記憶します。あなたのユースケースが直接満たされることはないかもしれませんが、jetserver のソース コードを調べて独自のロジックをスピンオフすれば、いくつかのアイデアを確実に得ることができます。

お気付きのように、ステートレスな UDP でさえセッションに関連付けられています。

于 2012-06-04T17:56:18.973 に答える