2012-12-26 19 views
13

Sto valutando SignalR per un'applicazione web a carico medio.Consegna garantita in SignalR

Ci aspettiamo ~ 500 msgs/sec, che non dovrebbe essere un problema con SignalR.

Tuttavia, siamo preoccupati per l'affidabilità di questa soluzione. Il nostro ambiente ha una rete problematica e non è raro che un client perda la sua connessione di rete per ~ 30 secondi. C'è qualche meccanismo per garantire che una volta che il client si riconnette, ottiene tutti i messaggi che sono stati inviati durante il suo tempo offline?

Grazie!

+1

Se siete alla ricerca di consegna garantita al 100%, SignalR non è un buon candidato per la soluzione. Hai bisogno di un sistema di accodamento robusto. – EkoostikMartin

+0

Si dovrebbe considerare RabbitMQ (http://www.rabbitmq.com/).È possibile mettere in coda i messaggi in coda per ciascun client anche se il client non è disponibile per estrarre messaggi da esso. – rpgmaker

+0

+1 EkoostikMartin. Se stai cercando un servizio di messaggistica affidabile, è necessario aggiungerlo sopra usando SignalR. – davidfowl

risposta

14

Un modo abbastanza semplice per gestire ciò sarebbe assegnare a ciascun messaggio un ID che si incrementa con ciascun messaggio. Il client avrebbe bisogno di tenere traccia dell'ultimo messaggio che aveva ricevuto e, al momento della riconnessione, avrebbe solo inviato quell'ID messaggio al server; e il server dovrebbe quindi inviare tutti i messaggi persi al client. Dovrebbe essere ragionevolmente semplice da implementare.

MODIFICA: Non credo che dovresti mantenere uno stato reale sul server vero e proprio - penso che quasi tutto potrebbe essere trasferito al tuo datastore o al tuo cliente. Il client invia l'ID o il timestamp dell'ultimo messaggio che aveva ricevuto:

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

Che ci si vuole una sorta di supporto datastore - in modo che quando il server riceve il messaggio updateMe(), si farebbe una interrogare sul database ed estrarre tutte le righe con un ID maggiore di quello appena ricevuto. Restituirebbe quelli al client come parte del valore restituito del suo metodo UpdateMe(). E poi proverebbe a consegnare tutti i nuovi messaggi che arrivano nello stesso modo in cui lo farebbe normalmente, chiamando metodi sul client.

Per quanto riguarda l'apolidia come obiettivo di SignalR: non posso commentare al riguardo, al di là di osservare che non riesco a immaginare un'applicazione del mondo reale ragionevolmente complessa che non avrebbe bisogno di avere una sorta di datastore di supporto, che si tratti di SignalR o di qualche altro framework (WCF, XSockets, ecc.) fa poca differenza.

+0

Come si può implementare questo utilizzando SignalR? E inoltre, questo mi costringerà ad avere uno stato sul server, che mancherà a uno degli obiettivi SignalR, per essere un fw senza stato. – ml123

+0

Vedere le mie modifiche sopra. –

+0

@ ml123 hai finito con l'uso di SignalR? Funziona bene? Tks – Pascal

2

Si potrebbe naturalmente utilizzare una sorta di assorbire tutti quadro, ma per raggiungere questo obiettivo con il minimo sforzo si può fare in questo modo ...

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

Sto usando XSockets.NET questa è una piattaforma di comunicazione in tempo reale (dal 2009) e i controller in XSockets.NET hanno lo stato, quindi è facile farlo.

MODIFICA: Ohh ... per testare questo uso due browser ad esempio chrome e safari, quindi disconnettere un browser ... inviare alcuni messaggi dall'altro, quindi riconnettersi per vedere i messaggi visualizzati. Devi usare due diversi browser su localhost dato che xsockets darà ad ogni browser un ID di archiviazione univoco.

MODIFICA: è stato aggiunto Func alla coda in modo da poter indirizzare i client specifici anche se sono offline. Ora solo i client che soddisfano le condizioni riceveranno messaggi se lo vorranno.

saluti Uffe