14

中負荷の Web アプリケーションの SignalR を評価しています。

1 秒あたり最大 500 メッセージが予想されますが、これは SignalR では問題になりません。

ただし、このソリューションの信頼性が心配です。私たちの環境には問題のあるネットワークがあり、クライアントがネットワーク接続を最大 30 秒間失うことは珍しくありません。クライアントが再接続すると、オフライン時に送信されたすべてのメッセージを確実に取得するメカニズムはありますか?

ありがとう!

4

2 に答える 2

15

これを処理するかなり簡単な方法の 1 つは、メッセージごとに増分する ID を各メッセージに割り当てることです。クライアントは、受信した最新のメッセージを追跡する必要があり、再接続時にそのメッセージ ID をサーバーに送信するだけです。サーバーは、見逃したすべてのメッセージをクライアントに送信する必要があります。実装はかなり簡単でなければなりません。

編集:サーバー上で実際の状態を適切に維持する必要はないと思います-ほとんどすべてがデータストアまたはクライアントにプッシュされる可能性があると思います. クライアントは、最後に受信したメッセージの ID またはタイムスタンプを送信します。

$.connection.myHub.server.updateMe(lastMessageId);

なんらかのバッキング データストアが必要になるため、サーバーがupdateMe()メッセージを受信すると、データベースに対してクエリを実行し、受信した ID よりも大きい ID を持つすべての行を取り出します。UpdateMe()それらは、メソッドの戻り値の一部としてクライアントに返されます。そして、クライアントでメソッドを呼び出すことにより、通常と同じ方法で新しいメッセージを配信しようとします。

ステートレス性が SignalR の目標であることについては、SignalR 上にあるかどうかにかかわらず、何らかのバッキング データストアを必要としない、かなり複雑な実世界のアプリケーションを想像できないことを観察する以外に、コメントすることはできません。他のフレームワーク (WCF、XSockets など) を使用してもほとんど違いはありません。

于 2012-12-28T07:01:36.660 に答える
3

もちろん、ある種のキューイングフレームワークを使用することもできますが、最小限の労力でこれを実現するには、次のように実行できます...

サーバーサイド:http ://pastebin.com/tuicQYGqクライアントサイド: http : //pastebin.com/a8EbusuG

私はリアルタイム通信プラットフォームであるXSockets.NETを使用しています(2009年以降)。XSockets.NETのコントローラーには状態があるため、これは簡単に実行できます。

編集:ああ...これをテストするには、たとえばchromeとsafariの2つのブラウザを使用してから、一方のブラウザを切断します...もう一方のブラウザからいくつかのメッセージを送信し、再接続してメッセージが表示されることを確認します。xsocketsは各ブラウザに一意のストレージIDを与えるため、ローカルホストでは2つの異なるブラウザを使用する必要があります。

編集:キューにFuncを追加して、オフラインの場合でも特定のクライアントをターゲットにできるようにしました。これで、必要に応じて、条件に一致するクライアントのみがメッセージを受け取ります。

よろしくUffe

于 2013-01-04T10:41:27.987 に答える