Czy gRPC (HTTP / 2) jest szybszy niż REST z HTTP / 2?

101

Celem jest wprowadzenie protokołu warstwy transportowej i aplikacji o lepszych opóźnieniach i przepustowości sieci . Obecnie aplikacja korzysta z REST z HTTP / 1.1 i doświadczamy dużego opóźnienia. Muszę rozwiązać ten problem z opóźnieniami i jestem otwarty na korzystanie z gRPC (HTTP / 2) lub REST / HTTP2 .

HTTP / 2:

  1. Multipleksowane
  2. Pojedyncze połączenie TCP
  3. Binarny zamiast tekstowy
  4. Kompresja nagłówka
  5. Serwer Push

Mam świadomość wszystkich powyższych zalet. Pytanie nr 1: Jeśli używam REST z HTTP / 2 , jestem pewien, że uzyskam znaczną poprawę wydajności w porównaniu do REST z HTTP / 1.1 , ale jak to się ma do gRPC (HTTP / 2) ?

Zdaję sobie również sprawę, że gRPC używa bufora proto, który jest najlepszą techniką serializacji binarnej do transmisji danych strukturalnych w sieci. Bufor Proto pomaga również w opracowaniu podejścia agnostycznego językowego. Zgadzam się z tym i mogę zaimplementować tę samą funkcję w REST za pomocą GraphQL. Ale moje obawy dotyczą serializacji: Pytanie nr 2: Kiedy HTTP / 2 implementuje tę funkcję binarną , czy użycie bufora proto daje dodatkową przewagę nad HTTP / 2?

Pytanie nr 3: Pod względem przesyłania strumieniowego, dwukierunkowych przypadków użycia , jak wypada porównanie gRPC (HTTP / 2) z (REST i HTTP / 2)?

W Internecie jest tak wiele blogów / filmów , które porównują gRPC (HTTP / 2) z (REST i HTTP / 1.1) w ten sposób . Jak wspomniano wcześniej, chciałbym poznać różnice, korzyści płynące z porównania GRPC (HTTP / 2) i (REST z HTTP / 2).

Lakshman Diwaakar
źródło
czego ostatecznie użyłeś? czy istnieje framework dla HTTP2 + REST?
knocte
@knocte Skończyło się na gPRC. Całkiem dobrze zmniejszyło opóźnienie. Jeśli chodzi o HTTP / 2 + REST, nie ma określonej struktury, to ustawienia, które musisz zmienić na serwerze, z którego korzystasz. Powiedzmy, że używasz nginx, zajrzyj do dokumentacji, aby zobaczyć kroki konfiguracji HTTP / 2.
Lakshman Diwaakar
i musisz się upewnić, że HTTP / 1.1 ponownie wykorzystuje połączenie. W przeciwnym razie wyszukaj „tcp zimny start”. gRPC domyślnie ponownie wykorzystuje połączenie.
bohdan_trotsenko

Odpowiedzi:

98

gRPC nie jest domyślnie szybszy niż REST przez HTTP / 2, ale zapewnia narzędzia, które przyspieszą. Jest kilka rzeczy, które byłyby trudne lub niemożliwe do zrobienia z REST.

  • Selektywna kompresja wiadomości. W gRPC przesyłanie strumieniowe RPC może zdecydować o kompresji lub nie kompresji wiadomości. Na przykład, jeśli przesyłasz strumieniowo mieszany tekst i obrazy w jednym strumieniu (lub naprawdę dowolną mieszaną zawartość podlegającą kompresji), możesz wyłączyć kompresję obrazów. Oszczędza to kompresję już skompresowanych danych, które nie będą już mniejsze, ale spowodują spalenie procesora.
  • Równoważenie obciążenia pierwszej klasy. Chociaż nie jest to poprawa w zakresie połączeń punktowych, gRPC może inteligentnie wybierać zaplecze, do którego ma kierować ruch. (jest to funkcja biblioteki, a nie funkcja protokołu przewodowego). Oznacza to, że możesz wysyłać żądania do najmniej obciążonego serwera zaplecza bez uciekania się do korzystania z serwera proxy. To jest wygrana z opóźnieniem.
  • Mocno zoptymalizowany. gRPC (biblioteka) podlega ciągłym testom porównawczym, aby zapewnić, że nie ma regresji szybkości. Te standardy są stale ulepszane. Ponownie, nie ma to nic wspólnego z protokołem gRPC, ale program będzie działał szybciej, jeśli używał gRPC.

Jak powiedział nfirvine, większość poprawy wydajności zauważysz tylko dzięki zastosowaniu Protobuf. Chociaż można używać protokołu Proto z REST, jest on bardzo ładnie zintegrowany z gRPC. Technicznie rzecz biorąc, można użyć JSON z gRPC, ale większość ludzi nie chce płacić kosztów wydajności po przyzwyczajeniu się do protosów.

Carl Mastrangelo
źródło
Dziękuję @Carl za odpowiedź. Czy możesz nam udostępnić linki / dokumenty wyjaśniające wszystkie powyższe rzeczy oraz link do testów porównawczych?
Lakshman Diwaakar
3
Zaktualizowałem odpowiedź na link do pulpitu nawigacyjnego. Nie mam doktorów bezpośrednio wyjaśniających te, ale jestem głównym współpracownikiem.
Carl Mastrangelo
proszę podać librarylink do równoważenia obciążenia
BozoJoe
16

W żadnym wypadku nie jestem ekspertem w tej dziedzinie i nie mam danych, aby to potwierdzić.

„Funkcja binarna”, o której mówisz, to binarna reprezentacja ramek HTTP / 2. Sama zawartość (ładunek JSON) nadal będzie w formacie UTF-8. Możesz skompresować ten JSON i ustawić Content-Encoding: gzip, tak jak HTTP / 1.

Ale gRPC obsługuje również kompresję gzip. Więc tak naprawdę mówimy o różnicy między JSON skompresowanymi gzip a protobufami skompresowanymi gzip.

Jak możesz sobie wyobrazić, skompresowane protobufy powinny pod każdym względem pokonać skompresowany JSON, w przeciwnym razie protobufy nie osiągnęły swojego celu.

Oprócz wszechobecności JSON i protobufs, jedyną wadą, jaką widzę w używaniu protobufów, jest to, że potrzebujesz .proto do ich odkodowania, powiedzmy w sytuacji tcpdump.

nfirvine
źródło
1
Dziękuję @nfirvine za opinię w tym pytaniu. Funkcja serializacji ma sens. Czy możesz dodać więcej szczegółów / wyjaśnienie, jak przebiega serializacja w REST i gRPC. Byłoby wspaniale, gdybyś mógł udostępnić kilka linków na tym samym.
Lakshman Diwaakar,