SignalR
Auparavant, la fonctionnalité de messagerie en temps réel était utilisée dans plusieurs de mes projets. Il semble fonctionner de manière fiable et est très facile à apprendre à utiliser.
La tentation, du moins pour moi, est d'abandonner le développement d'un service API Web et de l'utiliser SignalR
pour tout.
Je pense que cela pourrait être réalisé par une conception réfléchie, et si c'était le cas, cela signifierait beaucoup moins de code client. Plus important encore, cela signifierait qu'il n'y aurait qu'une seule interface vers les services plutôt qu'une interface divisée, et dans le pire des cas, que l'on pourrait la connecter sans penser au moment où les choses seront rendues, etc.
Donc, j'aimerais savoir:
- Existe-t-il une autre raison de ne pas utiliser SignalR à la place de tous les services Web en dehors des performances?
- Est-ce que la performance de SignalR est suffisamment préoccupante pour qu’il n’ait pas de sens de le faire?
Je rêvais depuis longtemps de pouvoir traduire les définitions d’objets et de services côté serveur en code d’accès aux services côté client, sans quelque chose de stupide node.js
. Par exemple, si je définis un objet intéressant InterestingObject
et un service à CRUD
l'objet InterestingObjectService
, je peux définir une route d'URL standard vers le service - par exemple, "/ {serviceName} / {methodName}" - mais je dois néanmoins écrire le code client pour y accéder. le service. Étant donné que l'objet va être passé du client au serveur et inversement, il n'y a aucune raison pratique d' avoirpour définir explicitement l'objet dans le code côté client, il ne devrait pas non plus être nécessaire de définir explicitement les itinéraires pour effectuer des opérations CRUD. Je pense qu’il devrait exister un moyen de normaliser tout cela pour qu’il soit possible d’écrire un client en partant du principe que l’accès au service fonctionne du client au serveur et inversement de manière aussi transparente que si j’écrivais WinForms ou Java. Applet ou application native ou ce que vous avez.
Si SignalR est assez bon à utiliser à la place d'un service Web traditionnel, il peut être un moyen viable d'y parvenir. SignalR inclut déjà des fonctionnalités permettant au concentrateur de fonctionner comme le service que je décris. Je pourrais donc définir un service de base commune (CRUD) qui offrirait toutes ces fonctionnalités prêtes à l'emploi avec un peu de réflexion. Ensuite, je pouvais presque prendre pour acquis l'accès au service, me épargnant le désagrément de réécrire du code pour accéder à quelque chose auquel on pouvait accéder par convention - et plus important encore, le temps qu'il me faudrait pour écrire le code afin de définir comment il est mis à jour les DOM.
Après avoir lu mon montage, je pense que cela peut paraître un peu absurde, alors n'hésitez pas à me demander si vous avez des questions sur ce que je veux en venir. En gros, je veux que l'accès au service soit aussi transparent que possible.
la source
Réponses:
Ces deux technologies ont un objectif très différent.
REST est destiné aux appels ordinaires à une API, le client étant un acteur actif de l'échange. Lorsque le client a besoin de trouver les coordonnées GPS d'une adresse, le client lance l'appel à l'API et attend jusqu'à ce qu'il reçoive les coordonnées, ou une erreur se produit, ou un délai d'attente écoulé.
Les sockets Web sont pour tout ce qui doit faire les choses de la manière opposée. Par exemple, lorsque j'utilise un site Web intranet qui affiche en temps réel les journaux et les performances de différents serveurs, le client peut être passif et attendre que le serveur lui envoie un nouveau journal ou des mesures de performance.
La différence est claire: dans le premier cas, le client décide quand il a besoin d’une information spécifique; dans le second cas, le client attend simplement d'être contacté et peut ne pas savoir quand.
D'une certaine manière, les deux sont interchangeables: vous pouvez implémenter des sockets Web lorsque vous n'en avez pas besoin (le client appelle le serveur par le biais de sockets Web au lieu de passer un appel REST) et vous pouvez utiliser la scrutation ou une longue interrogation. sockets Web (étant donné que cela a été utilisé avec succès pendant des années jusqu'à ce que les sockets Web soient devenus si populaires).
Mais leur interchangeabilité a un coût:
Lorsque vous utilisez une interrogation ou une interrogation longue au lieu de sockets Web, vous gaspillez souvent de la bande passante.
Lorsque vous utilisez des sockets Web pour faire ce que vous pouvez faire via une API Web, vous laissez toutes les connexions de tous les clients actifs ouvertes, ce qui peut ne pas être ce que vous voulez vraiment. Ce n'est pas un problème pour un petit site Web où vous vous attendez à avoir au plus 5 clients en même temps. Pour un service tel qu'Amazon AWS, cela ne serait pas facile à résoudre techniquement.
N'utilisez pas de sockets Web lorsque vous n'en avez pas besoin. Pour obtenir les coordonnées GPS d'une adresse, je ne gagne rien à l'ouverture d'une connexion Web Sockets, à l'appel, à l'attente d'une réponse et à la fermeture de la connexion: REST répond à mes besoins pour de tels scénarios.
Si vous vous retrouvez fréquemment à rechercher des informations par le biais d'un appel REST à un service, cela peut être un bon signe pour passer aux sockets Web. De même, Stack Overflow réduit l'utilisation de la bande passante en utilisant des sockets Web, car il aide les utilisateurs à ne pas perdre leur temps à appuyer sur la touche F5 de la page d'accueil pour voir s'ils ont de nouveaux messages.
Si vous constatez que vous ouvrez des connexions Web Sockets, utilisez-les pour passer un seul appel, puis fermez-les. Si vos connexions restent ouvertes et que le serveur envoie quelque chose au client uniquement à la demande de ce dernier, basculez sur REST.
De plus, les sockets Web ont encore un support limité et ne sont pas toujours faciles à mettre en œuvre. Bien que SignalR soit facile à implémenter, cela ne signifie pas que vous ne rencontrerez aucune difficulté à l'implémenter dans d'autres langages / contextes / environnements. Avec REST, c'est simple: il peut s'agir d'un
curl
appel ou d'une fonctionnalité similaire disponible dans toutes les langues courantes. Avec les sockets Web, vous ne savez pas exactement combien de temps cela prend pour qu'un client utilise [insérez le nom d'une langue que vous ne connaissez pas encore ici].J'ai utilisé des sockets Web dans plusieurs projets de .NET, Python et node.js.
En .NET, ce n'était pas si difficile, mais j'ai quand même passé quelques jours à essayer de résoudre certains problèmes énigmatiques, tels que la connexion interrompue dès son ouverture. (C'était avant SignalR; je n'ai jamais essayé SignalR). J'ai également utilisé WCF en mode Web Sockets, ce qui n'était pas sans problème non plus (mais je pense que WCF est toujours accompagné de problèmes).
Dans node.js, c'était faisable, mais j'ai dû permuter deux fois les bibliothèques jusqu'à ce que j'en trouve une qui fonctionne. Je crois que j'ai passé au moins une semaine à essayer de créer un support Web Hello World.
En Python, j'ai essayé une fois, passé deux ou trois jours et abandonné. Cela n'a jamais fonctionné.
Comparez cela à REST: le seul problème que l'on puisse rencontrer avec un nouveau langage / framework est de savoir comment poster des fichiers ou de recevoir une très grande réponse binaire. Je me souviens d'avoir passé quelques heures à chercher des solutions pour certaines langues. Pourtant, quelques heures pour un cas particulier ne sont rien comparées aux jours ou semaines d'un simple Hello World.
la source
Juste mes 2 cents ...
Je pense que ce n'est pas vraiment une question de performance ou autre. Il s'agit de normes. REST est un standard et IMHO présente les avantages suivants:
la source