3

そこで私は、Duplex Communications 用に人々が作成したサンプル例、つまり IIS によってホストされ、Silverlight 経由で接続された場合を見ていました。これにはたくさんの例があります (この MSDN の記事は素晴らしいです) が、すべて同じパラダイムを使用しています。

ユーザー A はサーバー A に接続し、将来の更新を受信するためにメモリ内リストに入れます。
ユーザー B がサーバー A に接続すると、リスト内のすべてのユーザーに誰かが「ログイン」したことが通知されます。

...しかし、いつ何が起こるか

ユーザー C はサーバー C に接続しますが、サーバー C のメモリ内リストにはユーザー A または B が含まれていません。

問題は、これをクラスター化された (Web ファーム) 環境に実装しようとしていることです。どのマシンが最終的に wcf 呼び出しを処理するかを確認できないため、これは事態を複雑にします。そのため、他のすべてのユーザーにメッセージを中継することは困難です。

私が考えることができる最良のシナリオは、実際にクライアントをある種のルーティング サービスに接続して、着信要求を受け取り、クライアントを特定のマシンに転送することです。もちろん、1 台のマシンがすべての着信要求を効果的に処理しているため、Web ファームの利点は失われます。

あまり効果的でない解決策は、サービスが何か (ファイルサーバー上のファイルまたは DB 内のテーブル) を継続的にポーリングして変更を探すことです。変更が表示されたら、それらをクライアントにプッシュします。これはとても醜い赤ちゃんのようですね。

私は何を逃したのですか?

更新 - ルーティング システムは私のニーズには対応していません。私のホスティング会社は、ファーム上の特定のマシンに IP 経由で直接接続することを許可していません。一般的なロードバランサーのフロントエンドにしか接続できないため、ユーザーが同じサーバーにアクセスすることを保証できません。

これまでのところ、データベース内のテーブルをポーリングして変更を探しています。まだ醜い赤ちゃんのようです。

4

8 に答える 8

2

各サーバーにインストールできるものを超えて環境をまったく制御できないと仮定すると (つまり、MSMQ や ESB がないなど)、サーバー間の通信に WCF を使用することを検討します。単純な問題は、2 つのサーバー間で同期を維持する必要があるメモリ内リストがあり、リストの内容が変更されるたびに、両方のサーバーのユーザーに通知する必要があることです。

両方のサーバーがホストして使用する内部 WCF サービスを使用すると、単純なファイア アンド フォーゲット メッセージングを使用して、リストの同期を保つことができます。次のシナリオを想像してください。

  1. 「ユーザー A」がサーバー A にログインする
    1. オンライン ユーザーのリストに「ユーザー A」を追加する
    2. サーバー B にメッセージを送信して、「ユーザー A」が追加されたことを通知します。
      1. サーバー B が「ユーザー A」をオンライン ユーザーのリストに追加するようにします。
      2. サーバー B がすべてのユーザーにユーザー ログインを通知するようにします。
    3. サーバー A のすべてのユーザーにユーザー ログインを通知する
  2. 「ユーザー B」がサーバー B にログインする
    1. 「ユーザー B」をオンライン ユーザーのリストに追加する
    2. サーバーAにメッセージを送信して、「ユーザーB」が追加されたことを通知します
      1. サーバー A が「ユーザー B」をオンライン ユーザーのリストに追加するようにします。
      2. サーバー A がすべてのユーザーにユーザー ログインを通知するようにします。
    3. サーバー B のすべてのユーザーにユーザー ログインを通知する
  3. 「ユーザー A」がサーバー A からログオフする
    1. オンライン ユーザーのリストから「ユーザー A」を削除する
    2. サーバー B にメッセージを送信して、「ユーザー A」が削除されたことを通知します。
      1. サーバー B がオンライン ユーザーのリストから「ユーザー A」を削除するようにします。
      2. サーバー B がすべてのユーザーにユーザーのログオフを通知するようにします。
    3. サーバー A のすべてのユーザーにユーザーのログオフを通知する
  4. 定期的に、サーバー A とサーバー B のリストを相互に同期させます (ピンポン スタイルを実装できます... 1 つのサーバーがそのリストを他のサーバーに ping し、他のサーバーがマージし、マージされたリストをポンポンします)。

上記のシナリオでは、相互に通信できるように、ホストされたサーバーに WCF サービスをインストールできることを前提としています。すべてのトラフィックがロードバランサーを通過する必要があると述べたように、各サーバーの内部で他のサーバーを知ることができるかどうかはわかりません。

于 2009-08-27T23:34:25.390 に答える
1

サーバーは相互に直接通信できますか?その場合は、ファーム内の他のサーバーのみが接続できるプライベートエンドポイントを設定することをお勧めします。次に、サーバーCはメッセージを受信すると、この事実を通知するメッセージをサーバーAに送信し、サーバーAはこれをクライアントに転送できます。

于 2009-08-22T05:41:25.970 に答える
1

リアルタイム タイプの通知が必要ないと仮定すると、一般的な方法は、現在ログインしているすべてのユーザーがすべてのクラスター化されたマシンに表示されるように、バックエンド セッション データベースまたは専用セッション サーバーを使用することです。次に、変更通知を送信するためのポーリング サービス、または要件に応じてより高度なサービスを作成できます。

この例では、「メモリ内」のユーザー リストを共有メモリ サーバーまたは共有データベースに移動します。もちろん、何らかのクラスター更新通知を実装してすべてのマシンに送信することもできますが、その複雑さはニーズをはるかに超えている可能性があります。

于 2009-08-10T23:01:56.187 に答える
1

Memcached または MSMQ を使用します。

Memcached を使用すると、ブロードキャストが必要なすべてのアイテムの単一の信頼できるポイントとして使用できます。したがって、クライアントのログインを取得したら、いくつかの単純なデータを Memcached にダンプします。他のサーバーに通知し、他のサーバーのリストを更新します。次に、情報を公開するときに、Memcached にクエリを実行します。

MSMQ を使用して、ログイン情報をキューにプッシュし、両方のサーバーにリスナーを実装して、キューから読み取り、"発行可能な" 情報のメモリ内リストを更新します。こうすることで、公開する必要があるデータが両方のサーバーに通知されます。

于 2009-08-25T15:05:13.267 に答える
0

「Sticky IP」を使用して Web ファームを構成できます。

つまり、クライアントが Web ファームに接続すると、クライアントは 1 台のマシンにルーティングされます。そのクライアントからの後続のすべての要求は、ファーム上の同じマシンに送られます。これは、質問で説明したルーティング サービスと少し似ています。

編集

おそらく最も簡単なのは、Silverlight クライアントが Web サーバーに「何か新しいことはありますか」と尋ねるポーリング システムを実装することです。その要求には、クライアントが最後に要求した時刻が含まれます。新しいもののリストは、データベース テーブルに保存されます。したがって、どのWebサーバーにアクセスしても問題ありません。

また、Silverlight WCF の制限に注意する必要があります。私の理解が正しければ、WCF のすべてを実装しているわけではありません。

編集2

同時にすべてのユーザーと通信する必要がある場合、呼び出しはデータベースに至るまで行う必要はありません。これは、WCF サービス レベルでメモリにキャッシュできます。他のクライアントはこれをメモリから取得するため、パフォーマンスが向上し、データベースの負荷が軽減されます。

編集3

Silverlight クライアントを使用している限り、クライアントが互いに直接通信することは困難です。追加の作業/コストが必要ですが、2 つの可能性があります。

  • Azure サービス バスを使用すると、各クライアントは直接通信に変換されるクラウド内のエンドポイントと通信します。
  • Silverlight を使用してドロップし、WCF サービス エンドポイントを公開できるクライアントを使用します。クライアントが起動すると、エンドポイントがサーバーに登録されます。その後、各クライアントは、オンラインのサーバーに問い合わせて、クライアントに直接メッセージを送信できます。
于 2009-07-30T13:22:58.827 に答える
0

MS の速度プロジェクトは、データベース バックエンドよりも高速なソリューションである可能性があります。これは、すべてのクラスタリング/フェイルオーバー機能を備えたインメモリ キャッシュ レイヤーです。WEB レイヤーと DB レイヤーの間にスライドさせることができます。その API は非常にシンプルで、.NET の他の部分とも一貫しています。

于 2009-08-27T23:36:06.040 に答える