Subskrypcje GraphQL krok po kroku

Subskrypcje GraphQL

Subskrypcje GraphQL: jak działają na poziomie transmisji | We.Inc

Czym są subskrypcje GraphQL, reguła jednego pola głównego, omówienie krok po kroku wiadomości graphql-ws, opcja SSE oraz sytuacje, w których polling jest lepszym wyborem.

Subskrypcja GraphQL to długotrwała operacja: klient wysyła dokument subskrypcji raz, a serwer wypycha nowy wynik za każdym razem, gdy zajdzie pasujące zdarzenie. GraphQL nie narzuca transportu. W praktyce działa przez WebSockety z protokołem graphql-ws lub przez Server-Sent Events. Każda operacja subskrypcji musi wybierać dokładnie jedno pole główne.

Subskrypcje, polling i ponowne pobieranie

Poniższy krokowy podgląd odtwarza jedną subskrypcję w protokole graphql-ws, wiadomość po wiadomości. Każdy krok pokazuje ramkę JSON przechodzącą przez gniazdo i stronę, która ją wysyła, od pierwszego handshake do końcowego complete.

Najczęściej zadawane pytania

Dlaczego tylko jedno pole główne na subskrypcję?

Każda subskrypcja odpowiada jednemu strumieniowi zdarzeń. graphql.org pokazuje, że umieszczenie dwóch pól głównych w jednej operacji subskrypcji jest niepoprawne; zamiast tego napisz dwie nazwane subskrypcje.

Jakiego podprotokołu WebSocket używa graphql-ws?

Podczas handshake negocjuje graphql-transport-ws, z typami ramek takimi jak connection_init, subscribe, next i complete. Inne biblioteki GraphQL dla WebSocketów mogą używać innego protokołu, więc zanim zaczniesz debugować cokolwiek innego, sprawdź, czy klient i serwer są zgodne.

Czy subskrypcje mogą działać bez WebSocketów?

Tak. Protokół graphql-sse wysyła każdy wynik jako Server-Sent Event o nazwie next i kończy się zdarzeniem complete. Działa przez zwykłe HTTP, co pomaga za proxy blokującymi upgrade do WebSocket.

Czy subskrypcje skalują się jak zapytania?

Nie. graphql.org zaznacza, że każdy subskrybujący klient jest przywiązany do instancji serwera i wymaga przechowywania stanu przez cały czas trwania subskrypcji, więc potrzebujesz też systemu pub/sub, który rozprowadzi zdarzenia między serwerami.

Co się dzieje, gdy subskrybujesz

Protokół graphql-ws w skrócie

Kiedy polling jest lepszym wyborem

Schemat i kod klienta

Deklaracja pola subskrypcji

Subscription to typ główny, tak jak Query i Mutation. Każde pole to jeden strumień, który klient może otworzyć.

Subskrybowanie klientem graphql-ws

createClient otwiera gniazdo leniwie, a iterate zwraca asynchroniczny iterator, który zwraca jeden wynik na zdarzenie.

Reguła jednego pola głównego

Rozdziel dwa strumienie na dwie operacje

Pojedyncza subskrypcja z reviewCreated i innym polem głównym nie przechodzi walidacji. Dwie nazwane operacje działają.

Klient wysyła connection_init

Wysyłane zaraz po otwarciu gniazda. Payload ma dowolną postać; serwery często odczytują z niego token.

Serwer wysyła connection_ack

Serwer zaakceptował połączenie. Wcześniej ramka subscribe zamknęłaby gniazdo z kodem 4401 Unauthorized.

Klient wysyła subscribe

Id wybiera klient i musi być unikalne wśród jego trwających operacji. Payload to zwykłe zapytanie i zmienne.

Serwer wysyła next

Opublikowano recenzję, więc serwer wykonał zestaw wyboru i wysłał wynik pod tym samym id.

Serwer ponownie wysyła next

Kolejne zdarzenie, kolejna ramka. Powtarza się to tak długo, jak subskrypcja pozostaje otwarta.

Klient wysyła complete

Użytkownik opuścił stronę, więc klient zatrzymuje operację. Gniazdo może pozostać otwarte dla innych subskrypcji.

Jedna subskrypcja, ramka po ramce

Wstecz

Dalej

Od nowa

Krok {n} z {v}

Ramka w gnieździe

Kopiuj ramkę

Wszystkie kroki

Zacznij za darmo · Bez karty kredytowej

Powiązane: Poradniki

Produkt

Dla kogo

Funkcje

Zasoby

Firma

Mapa strony