中荷重のウェブアプリケーションでSignalRを評価しています。SignalRで保証されています
〜500 msgs /秒が予想されますが、これはSignalRには問題ありません。
しかし、このソリューションの信頼性については心配しています。私たちの環境は問題のあるネットワークを持ち、クライアントが〜30秒間ネットワーク接続を失うことはまれではありません。クライアントが再接続すると、オフライン時に送信されたすべてのメッセージを確実に取得するメカニズムはありますか?
ありがとうございます!
中荷重のウェブアプリケーションでSignalRを評価しています。SignalRで保証されています
〜500 msgs /秒が予想されますが、これはSignalRには問題ありません。
しかし、このソリューションの信頼性については心配しています。私たちの環境は問題のあるネットワークを持ち、クライアントが〜30秒間ネットワーク接続を失うことはまれではありません。クライアントが再接続すると、オフライン時に送信されたすべてのメッセージを確実に取得するメカニズムはありますか?
ありがとうございます!
これを処理する簡単な方法の1つは、各メッセージに各メッセージに増分するIDを割り当てることです。クライアントは受信した最新のメッセージを追跡し、再接続するとそのメッセージIDをサーバーに送信するだけで済みます。サーバーは、欠落しているすべてのメッセージをクライアントに送信する必要があります。実装するのが合理的に簡単であるべきです。
EDIT: サーバーの実際の状態を維持する必要はないと思います。ほとんどすべてがデータストアまたはクライアントにプッシュアウトされる可能性があります。クライアントは、それを受け取っていたことを最後のメッセージのIDやタイムスタンプを送信します:
$.connection.myHub.server.updateMe(lastMessageId);
あなたはバッキングストアのいくつかの並べ替えをしたいと思います - サーバがupdateMe()
メッセージを受信したときに、それはどうなりますデータベースに対してクエリを実行し、今受信したIDよりも大きいIDを持つすべての行を取り出します。 UpdateMe()
メソッドの戻り値の一部としてクライアントに返します。そして、それは、クライアント上のメソッドを呼び出すことによって、通常と同じように新しいメッセージを提供しようとします。
SignalRの目標であるステートレス性については、私はそれについてコメントすることはできません。何らかのバッキングデータストアを必要としない複雑な現実世界のアプリケーションを想像することはできませんが、それがSignalRか他のフレームワーク(WCF、XSocketsなど)にあるかどうかはほとんど違いがありません。あなたがofcourseのあなたは、このようにそれを行うことができます最小限の労力でこれをachiveするのではなく、フレームワークをqueingのいくつかの種類を使用することができ
...
サーバーサイド:http://pastebin.com/tuicQYGq クライアント側:私は使用していますhttp://pastebin.com/a8EbusuG
XSockets.NETこれはリアルタイム通信プラットフォーム(2009年以降)であり、XSockets.NETのコントローラーには状態があり、これは簡単です。
EDIT:Ohh ...これをテストするには、クロムとサファリなどの2つのブラウザを使用し、1つのブラウザを切断します。もう一方のメッセージを送信してから、メッセージが表示されるように再接続します。 xsocketsは各ブラウザに一意のストレージIDを与えるので、localhost上で2つの異なるブラウザを使用する必要があります。
EDIT:オフラインであっても特定のクライアントをターゲットにできるように、キューにFuncを追加しました。必要に応じて、条件に一致するクライアントのみがメッセージを取得します。よろしく Uffe
あなたが100%保証された配信を探している場合は、SignalRはあなたのソリューションのための良い候補ではありません。堅牢なキューイングシステムが必要です。 – EkoostikMartin
RabbitMQ(http://www.rabbitmq.com/)を検討する必要があります。クライアントからメッセージを引き出すことができない場合でも、各クライアントのキューにメッセージをキューイングできます。 – rpgmaker
+1 EkoostikMartin。信頼性の高いメッセージングを探している場合は、SignalRを使用する上でレイヤリングする必要があります。 – davidfowl