web-dev-qa-db-fra.com

Est-ce que gRPC (HTTP / 2) est plus rapide que REST avec HTTP / 2?

L’objectif est d’introduire un protocole de transport et de couche d’application qui est meilleur dans ses latences et débits réseau. Actuellement, l'application utilise [~ # ~] rest [~ # ~] avec HTTP/1.1 et nous faisons l'expérience d'une latence élevée. J'ai besoin de résoudre ce problème de latence et je suis ouvert à l'utilisation de gRPC (HTTP/2) ou REST/HTTP2.

HTTP/2:

  1. Multiplexé
  2. Simple TCP Connexion
  3. Binaire au lieu de texte
  4. Compression d'en-tête
  5. Push serveur

Je suis conscient de tous les avantages ci-dessus. Question n ° 1: Si j'utilise REST avec HTTP/2, je suis sûr que j'obtiendrai une amélioration significative des performances par rapport à REST avec HTTP/1.1, mais comment cela se compare-t-il avec gRPC (HTTP/2)?

Je suis également conscient que gRPC utilise le proto buffer, qui est la meilleure technique sérialisation binaire pour la transmission de données structurées sur le fil. Proto buffer aide également à développer une approche agnostique des langues. Je suis d'accord avec cela et je peux implémenter la même fonctionnalité dans REST en utilisant graphQL. Mais ce qui me préoccupe, c'est la sérialisation: Question n ° 2: Quand HTTP/2 implémente cette fonctionnalité binaire, l'utilisation de proto buffer apporte-t-elle un avantage supplémentaire par rapport à HTTP/2?

Question n ° 3: En termes de cas d'utilisation bidirectionnels bidirectionnels, comment gRPC (HTTP/2) se compare-t-il à (REST et HTTP/2)?

Il y a tellement de blogs/vidéos sur Internet qui compare gRPC (HTTP/2) à (REST et HTTP/1.1) comme this . Comme indiqué précédemment, j'aimerais connaître les différences et les avantages de la comparaison entre GRPC (HTTP/2) et (REST avec HTTP/2).

62
Lakshman Diwaakar

gRPC n'est pas plus rapide que REST sur HTTP/2 par défaut, mais il vous donne les outils pour le rendre plus rapide. Certaines choses seraient difficiles voire impossibles à faire avec REST.

  • Compression de message sélective. Dans gRPC, un RPC en continu peut décider de compresser ou non les messages. Par exemple, si vous diffusez du texte et des images mélangés sur un seul flux (ou sur tout contenu compressible compressé), vous pouvez désactiver la compression pour les images. Cela vous évite de compresser des données déjà compressées qui ne deviendront pas plus petites, mais brûleront votre processeur.
  • Equilibrage de charge de première classe. Bien qu’il ne s’agisse pas d’une amélioration des connexions point à point, gRPC peut choisir de manière intelligente le serveur vers lequel envoyer le trafic. (Ceci est une fonctionnalité de bibliothèque, pas une fonctionnalité de protocole filaire). Cela signifie que vous pouvez envoyer vos demandes au serveur principal le moins chargé sans recourir à un proxy. C'est un gain de latence.
  • Fortement optimisé. gRPC (la bibliothèque) est sous points de repère continus pour s'assurer qu'il n'y a pas de régression de vitesse. Ces repères s'améliorent constamment. Encore une fois, cela n’a rien à voir avec le protocole gRPC, mais votre programme sera plus rapide pour avoir utilisé gRPC.

Comme nfirvine l’a dit, vous constaterez que l’amélioration de vos performances se limite à l’utilisation de Protobuf. Bien que vous puissiez utiliser proto avec REST, celui-ci est très bien intégré à gRPC. Techniquement, vous pouvez utiliser JSON avec gRPC, mais la plupart des gens ne veulent pas payer les coûts de performance après s'être habitués aux protos.

59
Carl Mastrangelo

Je ne suis en aucun cas un expert en la matière et je n’ai aucune donnée à ce sujet.

La "fonctionnalité binaire" dont vous parlez est la représentation binaire des trames HTTP/2. Le contenu lui-même (une charge JSON) sera toujours UTF-8. Vous pouvez compresser ce JSON et définir Content-Encoding: gzip, tout comme HTTP/1.

Mais gRPC utilise également la compression gzip. Nous discutons donc de la différence entre le format JSON compressé avec gzip et les protobufs compressés avec gzip.

Comme vous pouvez l'imaginer, les protobufs compressés doivent battre le JSON compressé de toutes les manières, sinon les protobufs ont échoué.

Outre l'omniprésence de JSON et de protobufs, le seul inconvénient de l'utilisation de protobufs est qu'il vous faut le. Proto pour les décoder, par exemple dans une situation de tcpdump.

8
nfirvine