Ist gRPC (HTTP / 2) mit HTTP / 2 schneller als REST?

91

Ziel ist es, ein Transport- und Anwendungsschichtprotokoll einzuführen, das hinsichtlich Latenz und Netzwerkdurchsatz besser ist . Derzeit verwendet die Anwendung REST mit HTTP / 1.1 und es tritt eine hohe Latenz auf. Ich muss dieses Latenzproblem lösen und bin offen für die Verwendung von gRPC (HTTP / 2) oder REST / HTTP2 .

HTTP / 2:

  1. Multiplexed
  2. Einzelne TCP-Verbindung
  3. Binär statt textuell
  4. Header-Komprimierung
  5. Server Push

Mir sind alle oben genannten Vorteile bekannt. Frage Nr. 1: Wenn ich REST mit HTTP / 2 verwende , kann ich sicher eine signifikante Leistungsverbesserung im Vergleich zu REST mit HTTP / 1.1 erzielen. Wie ist dies im Vergleich zu gRPC (HTTP / 2) ?

Mir ist auch bekannt, dass gRPC Protopuffer verwendet, die beste binäre Serialisierungstechnik für die Übertragung strukturierter Daten auf dem Draht. Protopuffer hilft auch bei der Entwicklung eines sprachunabhängigen Ansatzes. Ich bin damit einverstanden und kann dieselbe Funktion in REST mithilfe von graphQL implementieren. Mein Anliegen ist jedoch die Serialisierung: Frage Nr. 2: Wenn HTTP / 2 diese Binärfunktion implementiert , bietet die Verwendung von Protopuffer zusätzlich zu HTTP / 2 einen zusätzlichen Vorteil?

Frage Nr. 3: Wie ist gRPC (HTTP / 2) in Bezug auf Streaming und bidirektionale Anwendungsfälle mit (REST und HTTP / 2) zu vergleichen?

Es gibt so viele Blogs / Videos aus im Internet , die gRPC (HTTP / 2) mit (REST und HTTP / 1.1) wie vergleicht diese . Wie bereits erwähnt, möchte ich die Unterschiede und Vorteile beim Vergleich von GRPC (HTTP / 2) und (REST mit HTTP / 2) kennenlernen.

Lakshman Diwaakar
quelle
Was hast du letztendlich benutzt? Gibt es ein Framework für HTTP2 + REST?
Knocte
@knocte Am Ende habe ich gPRC verwendet. Es reduzierte die Latenz ziemlich gut. In Bezug auf HTTP / 2 + REST gibt es kein spezifisches Framework. Es sind die Einstellungen, die Sie auf dem von Ihnen verwendeten Server ändern müssen. Angenommen, Sie verwenden Nginx. In den Dokumenten finden Sie die Schritte zum Einrichten von HTTP / 2.
Lakshman Diwaakar
und Sie müssen sicherstellen, dass HTTP / 1.1 die Verbindung wiederverwendet. Andernfalls suchen Sie nach "TCP-Kaltstart". gRPC verwendet die Verbindung standardmäßig wieder.
Bohdan_Trotsenko

Antworten:

88

gRPC ist standardmäßig nicht schneller als REST über HTTP / 2, bietet Ihnen jedoch die Tools, um es schneller zu machen. Es gibt einige Dinge, die mit REST schwierig oder unmöglich zu tun wären.

  • Selektive Nachrichtenkomprimierung. In gRPC kann ein Streaming-RPC entscheiden, ob Nachrichten komprimiert oder nicht komprimiert werden sollen. Wenn Sie beispielsweise gemischten Text und Bilder über einen einzelnen Stream (oder wirklich einen gemischten komprimierbaren Inhalt) streamen, können Sie die Komprimierung für die Bilder deaktivieren. Dies erspart Ihnen das Komprimieren bereits komprimierter Daten, die nicht kleiner werden, aber Ihre CPU verbrennen.
  • Erstklassiger Lastausgleich. GRPC ist zwar keine Verbesserung der Punkt-zu-Punkt-Verbindungen, kann jedoch intelligent auswählen, an welches Backend der Datenverkehr gesendet werden soll. (Dies ist eine Bibliotheksfunktion, keine Drahtprotokollfunktion). Dies bedeutet, dass Sie Ihre Anforderungen an den am wenigsten belasteten Backend-Server senden können, ohne einen Proxy verwenden zu müssen. Dies ist ein Latenzgewinn.
  • Stark optimiert. gRPC (die Bibliothek) unterliegt kontinuierlichen Benchmarks, um sicherzustellen, dass es keine Geschwindigkeitsregressionen gibt. Diese Benchmarks verbessern sich ständig. Auch dies hat nichts mit dem Protokoll gRPC zu tun, aber Ihr Programm ist schneller, wenn Sie gRPC verwendet haben.

Wie Nfirvine sagte, werden Sie den größten Teil Ihrer Leistungsverbesserung nur durch die Verwendung von Protobuf sehen. Während Sie könnten Proto mit REST verwenden, ist es sehr schön mit gRPC integriert. Technisch gesehen könnten Sie JSON mit gRPC verwenden, aber die meisten Leute möchten die Leistungskosten nicht bezahlen, nachdem sie sich an Protos gewöhnt haben.

Carl Mastrangelo
quelle
Danke @Carl für die Antwort. Können Sie uns einige Links / Dokumente mitteilen, die alle oben genannten Dinge und den Link für Benchmarks erläutern?
Lakshman Diwaakar
3
Ich habe die Antwort aktualisiert, um auf das Dashboard zu verlinken. Ich habe keine Dokumente, die diese direkt erklären, aber ich bin ein Hauptverantwortlicher.
Carl Mastrangelo
Bitte geben Sie den libraryLink zum Lastenausgleich an
BozoJoe
13

Ich bin in keiner Weise ein Experte in diesem Bereich und ich habe keine Daten, um dies zu belegen.

Die "Binärfunktion", von der Sie sprechen, ist die binäre Darstellung von HTTP / 2-Frames. Der Inhalt selbst (eine JSON-Nutzlast) ist weiterhin UTF-8. Sie können diesen JSON komprimieren und festlegen Content-Encoding: gzip, genau wie HTTP / 1.

Aber gRPC komprimiert auch gzip. Wir sprechen also wirklich über den Unterschied zwischen gzip-komprimiertem JSON und gzip-komprimiertem Protobufs.

Wie Sie sich vorstellen können, sollten komprimierte Protobufs komprimiertes JSON in jeder Hinsicht schlagen, sonst haben Protobufs ihr Ziel verfehlt.

Neben der Allgegenwart von JSON gegenüber Protobufs ist der einzige Nachteil, den ich bei der Verwendung von Protobufs sehen kann, dass Sie die .proto-Datei benötigen, um sie zu dekodieren, beispielsweise in einer tcpdump-Situation.

Nfirvine
quelle
1
Vielen Dank an @nfirvine für Ihre Meinung zu dieser Frage. Die Serialisierungsfunktion macht irgendwie Sinn. Können Sie weitere Details / Erklärungen dazu hinzufügen, wie die Serialisierung in REST und gRPC erfolgt? Es wäre toll, wenn Sie einige Links auf dem gleichen teilen könnten.
Lakshman Diwaakar