GraphQL Subscriptions Schritt für Schritt

GraphQL Subscriptions

GraphQL Subscriptions: So funktionieren sie auf Protokollebene | We.Inc

Was GraphQL Subscriptions sind, die Regel mit genau einem Root-Feld, die graphql-ws-Nachrichten Schritt für Schritt, die SSE-Option und wann Polling die bessere Wahl ist.

Eine GraphQL Subscription ist eine langlebige Operation: Der Client sendet ein Subscription-Dokument einmal, und der Server schickt jedes Mal ein neues Ergebnis, wenn das passende Ereignis eintritt. GraphQL legt den Transport nicht fest. In der Praxis läuft es über WebSockets mit dem graphql-ws-Protokoll oder über Server-Sent Events. Jede Subscription-Operation muss genau ein Root-Feld auswählen.

Subscriptions, Polling und erneutes Abfragen

Der Stepper unten spielt eine Subscription über das graphql-ws-Protokoll Nachricht für Nachricht ab. Jeder Schritt zeigt den JSON-Frame, der über den Socket geht, und welche Seite ihn sendet, vom ersten Handshake bis zum abschließenden complete.

Häufige Fragen

Warum nur ein Root-Feld pro Subscription?

Jede Subscription entspricht einem Ereignisstrom. graphql.org zeigt, dass zwei Root-Felder in einer Subscription-Operation ungültig sind; schreibe stattdessen zwei benannte Subscriptions.

Welches WebSocket-Subprotokoll verwendet graphql-ws?

Es handelt beim Handshake graphql-transport-ws aus, mit Frame-Typen wie connection_init, subscribe, next und complete. Andere GraphQL-WebSocket-Bibliotheken nutzen eventuell ein anderes Protokoll, prüfe also zuerst, ob Client und Server sich einig sind, bevor du etwas anderes debuggst.

Laufen Subscriptions auch ohne WebSockets?

Ja. Das graphql-sse-Protokoll sendet jedes Ergebnis als Server-Sent Event namens next und endet mit complete. Es funktioniert über einfaches HTTP, was hinter Proxys hilft, die WebSocket-Upgrades blockieren.

Skalieren Subscriptions wie Queries?

Nein. graphql.org weist darauf hin, dass jeder abonnierte Client an eine Serverinstanz gebunden ist und für seine gesamte Lebensdauer Zustand braucht, daher benötigst du zusätzlich ein Pub/Sub-System, um Ereignisse auf mehrere Server zu verteilen.

Was beim Abonnieren passiert

Das graphql-ws-Protokoll in Kürze

Wann Polling die bessere Wahl ist

Schema und Client-Code

Ein Subscription-Feld deklarieren

Subscription ist ein Root-Typ wie Query und Mutation. Jedes Feld ist ein Strom, den ein Client öffnen kann.

Mit dem graphql-ws-Client abonnieren

createClient öffnet den Socket erst bei Bedarf, und iterate gibt einen asynchronen Iterator zurück, der pro Ereignis ein Ergebnis liefert.

Die Regel mit genau einem Root-Feld

Zwei Ströme in zwei Operationen aufteilen

Eine einzelne Subscription mit reviewCreated und einem weiteren Root-Feld scheitert an der Validierung. Zwei benannte Operationen funktionieren.

Client sendet connection_init

Wird direkt nach dem Öffnen des Sockets gesendet. Der Payload ist frei gestaltbar; Server lesen daraus oft ein Token.

Server sendet connection_ack

Der Server hat die Verbindung akzeptiert. Vorher würde ein subscribe-Frame den Socket mit 4401 Unauthorized schließen.

Client sendet subscribe

Die ID wählt der Client, und sie muss unter seinen laufenden Operationen eindeutig sein. Der Payload sind die übliche Query und die Variablen.

Server sendet next

Eine Bewertung wurde gepostet, also hat der Server das Selection Set ausgeführt und das Ergebnis unter derselben ID gesendet.

Server sendet erneut next

Ein weiteres Ereignis, ein weiterer Frame. Das wiederholt sich, solange die Subscription offen bleibt.

Client sendet complete

Der Nutzer hat die Seite verlassen, also beendet der Client die Operation. Der Socket kann für andere Subscriptions offen bleiben.

Eine Subscription, Frame für Frame

Zurück

Weiter

Neu starten

Schritt {n} von {v}

Frame auf dem Socket

Frame kopieren

Alle Schritte

Kostenlos starten · Keine Kreditkarte nötig

Verwandt: Ratgeber

Produkt

Für wen

Funktionen

Ressourcen

Unternehmen

Sitemap