Les performances sont-elles la seule raison de ne pas utiliser SignalR (Websockets) au lieu d'une API REST traditionnelle?

42

SignalRAuparavant, 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 SignalRpour 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:

  1. Existe-t-il une autre raison de ne pas utiliser SignalR à la place de tous les services Web en dehors des performances?
  2. 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 InterestingObjectet un service à CRUDl'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.

tacos_tacos_tacos
la source
5
Si vous avez une carte réseau magique pouvant garder ouverte un nombre infini de sockets et un réseau magique pouvant supporter une bande passante infinie et un serveur magique disposant d'une quantité infinie de mémoire et de cycles de processeurs, alors Websockets est un excellent choix!
Csla fait ce que vous voulez, les objets métier peuvent se déplacer entre le client et le serveur.
Andy

Réponses:

50

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 curlappel 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.

Arseni Mourzenko
la source
2
J'ai voté pour votre réponse, MainMa, car je l'ai trouvée intéressante / utile. Il y a un point que je ne comprends pas cependant. Vous mentionnez qu'un petit nombre de clients est acceptable pour gérer des sockets Web (par exemple, au plus 5 en même temps). Ensuite, vous mentionnez que StackOverflow utilise des sockets Web sur leur page d'accueil. Comment traitent-ils un nombre d'utilisateurs aussi élevé? Je demande parce que j'essaie plus de 20 connexions SignalR et que les retards de message commencent à ralentir lentement, avant que tout ne s'écroule (tout ne répond pas).
Gnychis
1
@gnychis: il existe de nombreuses solutions pour cela, mais beaucoup d’entre elles sont davantage liées à l’infrastructure elle-même (c’est le rôle de serverfault.com ). En général, jetez plus de matériel et divisez les utilisateurs entre les domaines, de sorte que certaines connexions soient gérées par sockets1.example.com, d'autres par sockets2.example.com, etc. Assez efficace mais également assez coûteux en matériel et en bande passante.
Arseni Mourzenko
3
Cette réponse est excellente, mais je voudrais préciser la question initiale. Si une application nécessite une connexion Websocket continue, pourquoi ne pas utiliser des websockets entièrement à la place d'une API REST? Puisqu'une websocket est ouverte, elle devrait peut-être être pleinement utilisée.
HappyNomad
Je viens de trouver une réponse à ma propre question.
HappyNomad
1

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:

  • Les requêtes HTTP sont simples à utiliser. Tout le monde peut rapidement utiliser une API REST. Heck, vous pouvez même ouvrir le navigateur et taper une URL pour voir les données, à quel point pouvez-vous être plus interactif?
  • (Presque) n'importe quel langage de programmation peut l'utiliser. C'est une sorte d'interface universelle. L'interfaçage avec SignalR à partir d'un langage exotique semble moins évident.
  • Il a un bon support d'outillage, comme http://petstore.swagger.wordnik.com/
  • C'est une "interface" agréable à déboguer. Vous pouvez facilement surveiller les messages entrants et sortants directement dans le navigateur, voir les données, etc. Avec websockets et les bibliothèques personnalisées, ce n'est pas si évident, vous devez tout enregistrer explicitement.
les dagnelies
la source
1
Bien que vous souligniez le fait que les API REST sont un peu plus simples et ont probablement de meilleurs outils, cette réponse dit quelques choses qui ne sont tout simplement pas vraies. REST n'est pas un standard , contrairement à WebSockets .
StriplingWarrior
1
Je suppose que c'était un mauvais libellé de ma part. Ce que je voulais dire par "standard", c'est être banal, largement utilisé, la manière par défaut de faire les choses ... et non "être un standard RFC".
dagnelies
Bonne clarification. En outre, Chrome vous permet au moins de voir le trafic WebSockets dans ses outils de développement. J'imagine que les autres navigateurs le font probablement aussi.
StriplingWarrior