web-dev-qa-db-fra.com

SignalR: Pourquoi choisir un hub contre une connexion persistante?

J'ai récemment cherché et lu sur SignalR et, même si je vois beaucoup d'explications sur la différence entre les concentrateurs et les connexions persistantes, je n'ai pas réussi à me faire une idée au niveau suivant. C'est pourquoi choisir une approche sur l'autre?

149
Craig W.

D'après ce que je vois dans le section Connexion et hubs , il semble que les hubs fournissent un système de sujets superposant les connexions persistantes de niveau inférieur.

D'après le commentaire très positif ci-dessous:

Partiellement correct. Vous pouvez également obtenir des sujets ou des groupes dans des connexions persistantes. La grande différence est l'envoi de différents types de messages. Par exemple, vous avez différents types de messages et vous souhaitez envoyer différents types de données utiles. Avec les connexions persistantes, vous devez incorporer le type de message dans la charge (voir Exemple brut), mais les hubs vous permettent de faire du RPC sur une connexion (vous permet d’appeler des méthodes sur le client depuis le serveur et de serveur à client). . Une autre grande chose est la liaison de modèle. Les hubs vous permettent de transmettre des paramètres fortement typés aux méthodes.

L'exemple utilisé dans la documentation utilise une métaphore de salle de discussion, dans laquelle les utilisateurs peuvent rejoindre une salle spécifique et ne recevoir ensuite les messages que d'autres utilisateurs se trouvant dans la même salle. Plus généralement, votre code s'abonne à un sujet et ne reçoit ensuite que les messages publiés sur ce sujet. Avec les connexions persistantes, vous obtiendrez tous les messages.

Vous pouvez facilement créer votre propre système de sujets par-dessus les connexions persistantes, mais dans ce cas, l'équipe de SignalR a déjà effectué le travail pour vous.

92
Frank van Puffelen

La principale différence est que vous ne pouvez pas créer de RPC avec PersistentConnection, vous ne pouvez envoyer que des données brutes. Donc, au lieu d’envoyer des messages du serveur comme ceci

Clients.All.addNewMessageToPage(name, message);

vous devez envoyer un objet avec Connection.Broadcast() ou Connection.Send(), puis le client doit décider quoi faire avec cela. Vous pouvez, par exemple, envoyer un objet comme celui-ci:

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

Et sur le client, au lieu de simplement définir

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

vous devez ajouter un rappel pour gérer tous les messages entrants:

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

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

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

Vous devrez effectuer le même type de distribution côté serveur dans la méthode OnReceived. Vous devez également désérialiser la chaîne de données là-bas au lieu de recevoir les objets fortement typés comme vous le faites avec les méthodes hub.

Il n'y a pas beaucoup de raisons de choisir PersistentConnection sur les hubs. Une des raisons dont je suis conscient est qu'il est possible de envoyer du JSON pré-numéroté via PersistentConnection, ce que vous ne pouvez pas utiliser avec des concentrateurs. Dans certaines situations, cela peut constituer un avantage de performance pertinent.

En dehors de cela, voir cette citation de la documentation :

Choisir un modèle de communication

La plupart des applications doivent utiliser l'API Hubs. L'API Connections peut être utilisée dans les cas suivants:

  • Le format du message envoyé doit être spécifié.

  • Le développeur préfère utiliser un modèle de messagerie et de répartition plutôt qu'un modèle d'appel à distance.

  • Une application existante qui utilise un modèle de messagerie est en cours de transfert pour utiliser SignalR.

En fonction de la structure de votre message, l'utilisation de PersistentConnection peut présenter de petits avantages en termes de performances.

Vous voudrez peut-être jeter un coup d’œil sur les exemples de SignalR, en particulier ceci ici.

63
Lars Höppner

Il existe deux manières d’utiliser SignalR: vous pouvez y accéder à un niveau bas en remplaçant sa classe PersistentConnection, ce qui vous donne beaucoup de contrôle sur lui; ou vous pouvez laisser SignalR se charger de tout le travail lourd à votre place, en utilisant les "Hubs" de haut niveau.

23
msn.secret

La connexion persistante est une API de niveau inférieur, vous pouvez effectuer des actions à une heure plus spécifique lorsque la connexion est ouverte ou fermée. Dans la plupart des applications, le hub est le meilleur choix.

5
xurxodev

Trois points principaux doivent être pris en compte lorsque l'on compare ces deux aspects:

  • Format du message
  • Modèle de communication
  • Personnalisation de SignalR

Avec les hubs, le formatage des messages est essentiellement géré par vous, mais avec les connexions persistantes, le message est brut et a été marqué et analysé dans les deux sens. Si la taille du message est importante, notez également que la charge utile d'une connexion persistante est bien inférieure à celle d'un concentrateur.

En ce qui concerne le modèle de communication, les connexions persistantes ont essentiellement une fonction d'envoi et de réception de messagerie tandis que les concentrateurs prennent un modèle appel de procédure distante avec une fonction unique par exigence.

En ce qui concerne la personnalisation, les connexions persistantes étant plus basses, elles peuvent vous donner plus de contrôle sur la personnalisation.

4
Thulani Chivandikwa