2012-12-26 11 views
13

Ich evaluiere SignalR für eine Medium-Load-Webanwendung.Garantierte Lieferung in SignalR

Wir erwarten ~ 500 msgs/sec, was kein Problem mit SignalR sein sollte.

Wir sind jedoch besorgt über die Zuverlässigkeit dieser Lösung. Unsere Umgebung hat ein problematisches Netzwerk, und es ist nicht selten, dass ein Client seine Netzwerkverbindung für ca. 30 Sekunden verliert. Gibt es einen Mechanismus, der sicherstellt, dass nach der erneuten Verbindung des Clients alle Nachrichten empfangen werden, die während der Offline-Zeit gesendet wurden?

Danke!

+1

Wenn Sie für 100% garantierte Lieferung suchen, ist SignalR kein guter Kandidat für Ihre Lösung. Sie benötigen ein robustes Warteschlangensystem. – EkoostikMartin

+0

Sie sollten RabbitMQ (http://www.rabbitmq.com/) betrachten.Sie können Nachrichten in der Warteschlange für jeden Client in eine Warteschlange stellen, auch wenn der Client nicht dazu in der Lage ist, Nachrichten daraus abzurufen. – rpgmaker

+0

+1 EkoostikMartin. Wenn Sie nach zuverlässigem Messaging suchen, müssen Sie zusätzlich zur Verwendung von SignalR eine Schicht erstellen. – davidfowl

Antwort

14

Eine ziemlich einfache Möglichkeit, dies zu handhaben, wäre, jeder Nachricht eine ID zuzuweisen, die mit jeder Nachricht zunimmt. Der Client muss die letzte Nachricht, die er erhalten hat, im Auge behalten und beim erneuten Verbinden diese Nachrichten-ID an den Server senden. und der Server müsste dann alle verpassten Nachrichten an den Client senden. Sollte relativ einfach zu implementieren sein.

EDIT: Ich glaube nicht, dass Sie wirklich auf dem Server einen echten Zustand beibehalten müssten - ich denke, fast alles davon könnte in Ihren Datenspeicher oder auf Ihren Client geschoben werden. Der Kunde würde die ID oder Zeitstempel der letzten Nachricht senden, die er erhalten hatte:

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

Sie würden eine Art von Trägerdatenspeichern wollen - so, wenn der Server empfängt die Nachricht updateMe(), wäre es ein tun Abfrage auf der Datenbank und ziehen Sie alle Zeilen mit einer ID größer als die, die es gerade erhalten hat. Es würde diese als Teil des Rückgabewerts seiner UpdateMe()-Methode an den Client zurückgeben. Und dann würde es versuchen, neue Nachrichten zu liefern, die auf die gleiche Weise kommen, wie es normalerweise der Fall wäre, indem Methoden auf dem Client aufgerufen werden.

Wie Staatenlosigkeit ein Ziel von SignalR ist: Ich kann das nicht kommentieren, außer zu beobachten, dass ich mir keine vernünftig komplexe reale Anwendung vorstellen kann, die keine Art von Backing-Datastore hätte. Ob es sich um SignalR oder ein anderes Framework (WCF, XSockets usw.) handelt, macht wenig Unterschied.

+0

Wie können Sie dies mit SignalR implementieren? Und das wird mich auch zwingen, einen Status auf dem Server zu haben, der eines der Ziele von SignalR verpassen wird, ein zustandsloses fw zu sein. – ml123

+0

Siehe meine Änderungen oben. –

+0

@ ml123 haben Sie am Ende SignalR verwendet? Funktioniert es gut? Tks – Pascal

2

Sie natürlich eine Art von queing Framework verwenden könnte, aber dies mit minimalem Aufwand achive Sie es so machen kann ...

Serverside: http://pastebin.com/tuicQYGq Clientside: http://pastebin.com/a8EbusuG

Ich bin mit XSockets.NET das ist eine Echtzeit-Kommunikationsplattform (seit 2009) und die Controller in XSockets.NET haben Status, so dass dies einfach zu tun ist.

EDIT: Ohh ... um dies zu testen verwenden Sie zwei Browser zum Beispiel Chrom und Safari, dann trennen Sie einen Browser ... senden Sie einige Nachrichten von der anderen dann erneut verbinden, um die Nachrichten angezeigt zu sehen. Sie müssen zwei verschiedene Browser auf localhost verwenden, da xsockets jedem Browser eine eindeutige Speicher-ID gibt.

BEARBEITEN: Func wurde der Warteschlange hinzugefügt, sodass Sie bestimmte Clients gezielt ansprechen können, auch wenn sie offline sind. Jetzt erhalten nur Clients, die Bedingungen erfüllen, Nachrichten, wenn Sie möchten.

Grüße Uffe