SignalR: Perché scegliere Hub vs. Persistent Connection?


150

Ho cercato e letto su SignalR di recente e, mentre vedo molte spiegazioni su quale sia la differenza tra Hub e connessioni persistenti, non sono stato in grado di orientarmi al livello successivo, motivo per cui dovrei scegliere un approccio rispetto all'altro?

Risposte:


92

Da quello che vedo nella sezione Connessione e Hub sembra che Hub fornisca un sistema di argomenti che sovrappone le connessioni persistenti di livello inferiore.

Dal commento altamente votato di seguito:

Parzialmente corretto. È possibile ottenere argomenti o gruppi anche in connessioni persistenti. La grande differenza è l'invio di diversi tipi di messaggi. Ad esempio, hai diversi tipi di messaggi e desideri inviare diversi tipi di payload. Con connessioni persistenti devi incorporare il tipo di messaggio nel payload (vedi esempio Raw) ma gli hub ti danno la possibilità di eseguire RPC su una connessione (ti consente di chiamare metodi sul client dal server e dal server al client) . Un'altra cosa importante è l'associazione dei modelli. Gli hub consentono di passare parametri fortemente tipizzati ai metodi.

L'esempio utilizzato nella documentazione utilizza una metafora della chat room, in cui gli utenti possono entrare in una room specifica e quindi ricevere messaggi da altri utenti nella stessa room. Più genericamente il tuo codice si abbona a un argomento e quindi ottiene solo i messaggi pubblicati su quell'argomento. Con le connessioni persistenti otterrai tutti i messaggi.

Potresti facilmente costruire il tuo sistema di argomenti in cima alle connessioni persistenti, ma in questo caso il team SignalR ha già fatto il lavoro per te.


180
Parzialmente corretto. È possibile ottenere argomenti o gruppi anche in connessioni persistenti. La grande differenza è l'invio di diversi tipi di messaggi. Ad esempio, hai diversi tipi di messaggi e desideri inviare diversi tipi di payload. Con connessioni persistenti devi incorporare il tipo di messaggio nel payload (vedi esempio Raw) ma gli hub ti danno la possibilità di fare RPC su una connessione (ti permette di chiamare metodi sul client dal server e dal server al client) . Un'altra cosa importante è l'associazione dei modelli. Gli hub consentono di passare parametri fortemente tipizzati ai metodi.
davidfowl,

1
Buon punto @davidfowl - Ho copiato il tuo commento nella risposta poiché penso che dovrebbe essere più evidente.
ColinE,

63

La differenza principale è che non è possibile eseguire RPC con PersistentConnection, è possibile inviare solo dati non elaborati. Quindi, invece di inviare messaggi dal server in questo modo

Clients.All.addNewMessageToPage(name, message);

dovresti inviare un oggetto con Connection.Broadcast()o Connection.Send()e quindi il cliente dovrebbe decidere cosa farne. Ad esempio, potresti inviare un oggetto come questo:

Connection.Broadcast(new {
    method: "addNewMessageToPage",
    name: "Albert",
    message: "Hello"
});

E sul client, anziché semplicemente definire

yourHub.client.addNewMessageToPage = function(name, message) { 
    // things and stuff
};

dovresti aggiungere un callback per gestire tutti i messaggi in arrivo:

function addNewMessageToPage(name, message) {
    // things and stuff
}

connection.received(function (data) {
    var method = data.method;

    window[method](data.name, data.message);
});

Dovresti fare lo stesso tipo di invio sul lato server nel OnReceivedmetodo. Dovresti anche deserializzare la stringa di dati lì invece di ricevere gli oggetti fortemente tipizzati come fai con i metodi hub.

Non ci sono molti motivi per scegliere PersistentConnection su Hub. Uno dei motivi per cui sono a conoscenza è che è possibile inviare JSON pre-serializzato tramite PersistentConnection, cosa che non è possibile eseguire utilizzando gli hub. In alcune situazioni, questo potrebbe essere un vantaggio prestazionale rilevante.

A parte questo, vedi questa citazione dalla documentazione :

Scelta di un modello di comunicazione

La maggior parte delle applicazioni dovrebbe utilizzare l'API Hubs. L'API di Connections potrebbe essere utilizzata nelle seguenti circostanze:

  • È necessario specificare il formato del messaggio effettivo inviato.

  • Lo sviluppatore preferisce lavorare con un modello di messaggistica e invio piuttosto che con un modello di chiamata remoto.

  • Un'applicazione esistente che utilizza un modello di messaggistica viene trasferita per utilizzare SignalR.

A seconda della struttura del messaggio, è possibile ottenere anche piccoli vantaggi dall'uso di PersistentConnection.

Potresti dare un'occhiata ai campioni SignalR, in particolare qui.


Uno dei miei colleghi mi ha detto che il motivo per cui ha scelto PersistentConnection su Hubs è un motivo di sicurezza, c'è qualche problema di sicurezza in Hubs o qualcosa del genere?
Mehdi Dehghani,

24

Esistono due modi per usare SignalR: puoi accedervi a un livello basso sovrascrivendo la sua PersistentConnectionclasse, che ti dà molto controllo su di esso; oppure puoi fare in modo che SignalR faccia tutto il lavoro pesante per te, usando gli "Hub" di alto livello.


5

La connessione permanente è un'API di livello inferiore, è possibile eseguire azioni in momenti più specifici quando la connessione viene aperta o chiusa, nella maggior parte delle applicazioni l'hub è la scelta migliore


4

Ci sono tre punti principali da considerare quando si confrontano questi due:

  • Formato del messaggio
  • Modello di comunicazione
  • Personalizzazione SignalR

Con hub la formattazione dei messaggi viene sostanzialmente gestita da te, ma con connessioni persistenti il ​​messaggio è grezzo ed è stato tokenizzato e analizzato avanti e indietro. Se la dimensione del messaggio è importante, si noti inoltre che il payload di una connessione persistente è molto inferiore a quello di un hub.

Per quanto riguarda il modello di comunicazione, le connessioni persistenti hanno sostanzialmente una funzione per l'invio e la ricezione di messaggi mentre gli hub accettano un modello di chiamata di procedura remota con funzione unica per requisito.

Quando si tratta di personalizzazione poiché le connessioni persistenti sono di livello più basso, possono offrire un maggiore controllo sulla personalizzazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.