Zum Inhalt springen

GraphQL Apollo Federation Subscriptions

GraphQL-API-Entwicklung für flexible und effiziente Daten-APIs

GraphQL beseitigt Over- und Under-Fetching, indem Clients genau die Daten anfordern, die sie benötigen — was API-Roundtrips, Payload-Größe und Frontend-Komplexität reduziert. Wir entwerfen GraphQL-Schemas, optimieren die Resolver-Performance (DataLoader, Begrenzung der Query-Tiefe), implementieren Echtzeit-Subscriptions und bauen föderierte GraphQL-Gateways für US- und EU-Kunden auf Node.js-, Python- und Java-Backends.

Angebot anfordern Fallstudien ansehen

GraphQL beseitigt Over- und Under-Fetching, indem Clients genau die Daten anfordern, die sie benötigen — was API-Roundtrips, Payload-Größe und Frontend-Komplexität reduziert. Wir entwerfen GraphQL-Schemas, optimieren die Resolver-Performance (DataLoader, Begrenzung der Query-Tiefe), implementieren Echtzeit-Subscriptions und bauen föderierte GraphQL-Gateways für US- und EU-Kunden auf Node.js-, Python- und Java-Backends.

Herausforderungen

Branchenherausforderungen, die wir lösen

Das N+1-Resolver-Problem

Verschachtelte GraphQL-Queries lösen N+1-Datenbankaufrufe aus — einen pro übergeordnetem Element. Wir setzen DataLoader für alle Listen-Resolver ein und bündeln Datenbankaufrufe zu einer einzigen Query pro Typ pro Request.

Zu freizügige Schema-Exposition

In der Produktion aktivierte Introspection legt Angreifern das vollständige Datenmodell offen. Wir deaktivieren Introspection in der Produktion, ergänzen eine Begrenzung der Query-Tiefe (max. 7 Ebenen) und eine Analyse der Query-Komplexität (max. Score 1000).

Schema-Versionierung ohne Brüche bei Clients

GraphQL-Schemas sind versionslos — das Deprecaten von Feldern erfordert Abstimmung mit allen Clients. Wir nutzen @deprecated-Direktiven, überwachen die Nutzung veralteter Felder in Apollo Studio und pflegen einen mit den Client-Teams abgestimmten Zeitplan zur Feldentfernung.

Federation-Komplexität bei Skalierung

Apollo-Federation-Supergraphs mit über 10 Subgraphs bringen Herausforderungen beim Distributed Tracing und Fehler bei der Schema-Komposition mit sich. Wir strukturieren Subgraph-Grenzen nach Domäne, testen die Komposition in der CI und implementieren Distributed Tracing auf Gateway-Ebene.

Skalierung von Echtzeit-Subscriptions

WebSocket-basierte Subscriptions sind zustandsbehaftet — ohne ein Pub/Sub-Backend skalieren sie nicht horizontal. Wir verwenden Redis Pub/Sub als Transportschicht für Subscriptions, sodass jede Gateway-Instanz jede Subscription bedienen kann.

DSGVO-Zugriffskontrolle auf Feldebene

Die DSGVO verlangt, dass EU-PII nur an autorisierte Aufrufer zurückgegeben wird. Wir implementieren Feld-Direktiven auf Resolver-Ebene (@auth, @redact), die Claims aus dem JWT-Kontext prüfen, bevor PII-Felder zurückgegeben werden — nicht auf der HTTP-Ebene.

Lösungen

Lösungen, die wir umsetzen

GraphQL-Schema-Design und -Evolution

Domänengetriebenes Schema-Design mit Relay-style-Pagination, Connection-Typen und Input-Validierung — gebaut für langfristige Weiterentwicklung ohne Brüche bei Clients.

Security-Härtung für die Produktion

Deaktivierte Introspection, Limits für Query-Tiefe und -Komplexität, Persisted Queries für Produktiv-Clients, JWT-Kontextvalidierung und @auth-Direktiven auf Feldebene.

DataLoader und Performance-Optimierung

DataLoader-Batching für alle N+1-Resolver-Muster, Redis-Query-Caching für aufwändige Resolver und Analyse der Query-Komplexität, um teure Operationen zu erkennen, bevor sie in die Produktion gelangen.

Apollo-Federation-Gateway

Föderierter Supergraph aus mehreren Subgraphs — Entity-Referenzen, @key-Direktiven, Tests der Subgraph-Komposition in der CI und Distributed Tracing auf Gateway-Ebene.

Echtzeit-GraphQL-Subscriptions

WebSocket-Subscriptions mit Redis-Pub/Sub-Backend — horizontal skalierbar, mit automatischer Wiederverbindung und Subscription-Deduplizierung auf dem Client.

GraphQL-Migration von REST

Inkrementelle Migrationsstrategie: Das GraphQL-Gateway bindet bestehende REST-Endpunkte über RESTDataSource ein und ersetzt sie schrittweise durch native Resolver, während das Backend migriert.

Stack

Technologie-Stack

GraphQL, Apollo Server 4, Apollo Federation 2, DataLoader, GraphQL Yoga, Strawberry (Python), Netflix DGS (Java), WebSockets (Subscriptions), PostgreSQL, Redis, Sentry.

Compliance

Compliance & Regulierung

DSGVO-konform · Begrenzung der Query-Tiefe · Auth auf Feldebene · PII-Maskierung in Resolvern

EU

  • DSGVO — Berechtigungsprüfungen auf Feldebene in Resolvern; PII-Felder für nicht autorisierte Rollen maskiert; Query-Audit-Log.
  • EU-KI-Verordnung — Protokollierung von Entscheidungsfeldern für KI-gestützte GraphQL-Resolver.
  • eIDAS — OAuth2-JWT-Validierung im Apollo-Kontext; Weitergabe von Rollen-Claims an Resolver.
  • NIS2 — Begrenzung von Query-Komplexität und -Tiefe zur DoS-Abwehr; CVE-Scanning der GraphQL-Abhängigkeiten.

USA

  • HIPAA — PHI-Felder auf autorisierte Resolver-Rollen beschränkt; Audit-Log pro Feldzugriff.
  • SOC 2 — Query-Logging, Erfassung von Resolver-Fehlern in Sentry, Rate Limiting über Redis.
  • CCPA/CPRA — Resolver für Betroffenenanfragen; PII-Feld-Opt-out per Direktive.
  • FedRAMP-nah — Verschlüsselung sensibler Daten auf Feldebene in Resolvern.

Warum YuSMP

Warum Produktteams YuSMP für GraphQL-Entwicklung wählen

Schema-first, nicht Resolver-first

Wir entwerfen das GraphQL-Schema als Produktvertrag, bevor wir Resolver schreiben — so dient die API den Anforderungen des Frontends, nicht der Bequemlichkeit des Backends.

DataLoader ab dem ersten Resolver

N+1 ist das häufigste GraphQL-Problem in der Produktion. Wir implementieren DataLoader für jeden Listen-Resolver vom ersten Tag an, nicht erst nach dem ersten Performance-Vorfall.

Von Anfang an Federation-bereit

Selbst Single-Graph-Projekte werden mit Federation-kompatiblen Typen gebaut — @key-Direktiven, Entity-Resolver —, sodass das spätere Hinzufügen eines zweiten Subgraphs additiv ist und nichts bricht.

FAQ

FAQ zur GraphQL-Entwicklung

Wann sollte ich GraphQL statt REST einsetzen?

GraphQL ist die bessere Wahl, wenn: mehrere Clients (Web, iOS, Android, Partner) dieselbe API nutzen und unterschiedliche Datenbedürfnisse haben; das Frontend-Team seine Datenanforderungen häufig ändert; Sie Echtzeit-Subscriptions zusätzlich zu Queries benötigen; oder Sie eine Produktplattform aufbauen, auf der Drittentwickler Ihre Daten abfragen. REST ist die bessere Wahl für einfache CRUD-Dienste, öffentliche APIs, bei denen HTTP-Caching entscheidend ist, oder Teams ohne GraphQL-Erfahrung, bei denen die Lernkurve den Nutzen überwiegt.

Wie funktioniert Apollo Federation?

Apollo Federation 2 setzt mehrere Subgraph-Schemas zu einem einzigen Supergraph zusammen. Jeder Subgraph besitzt seine Domänentypen und stellt mit @key gekennzeichnete Entitäten bereit. Der Apollo Router (oder Apollo Gateway) leitet eingehende Queries an die richtigen Subgraphs weiter, ruft Entity-Referenzen über die Direktiven @external und @requires ab und setzt die Antwort zusammen. Die Schema-Komposition wird in der CI validiert — der Router startet nur, wenn der zusammengesetzte Supergraph gültig ist.

Wie verhindern Sie Denial-of-Service-Angriffe auf GraphQL?

Begrenzung der Query-Tiefe (max. 7 Ebenen), Analyse der Query-Komplexität (max. Score 1000, pro Feld berechnet), Rate Limiting auf der HTTP-Ebene über Redis, Persisted Queries (Produktiv-Clients können nur vorab freigegebene Queries ausführen) und in der Produktion deaktivierte Introspection. Für umfangreiche APIs ergänzen wir APQ (Automatic Persisted Queries), um die Payload-Größe zu reduzieren, sowie Apollo-Studio-Anomalieerkennung für ungewöhnliche Query-Muster.

Wie skalieren GraphQL-Subscriptions horizontal?

GraphQL-Subscriptions sind WebSocket-Verbindungen — zustandsbehaftet. Eine einzelne Serverinstanz kann Tausende von Subscriptions halten, doch horizontale Skalierung erfordert das Weiterleiten von Subscription-Events an den richtigen Server. Wir nutzen Redis Pub/Sub: Tritt ein Event auf, schreibt der publizierende Dienst in Redis; jede Gateway-Instanz abonniert Redis und leitet das Event an die richtige WebSocket-Verbindung weiter. Das skaliert auf Hunderttausende gleichzeitiger Subscriptions.

Wie handhaben Sie Datei-Uploads in GraphQL?

Die GraphQL-Spezifikation deckt Datei-Uploads nicht ab. Wir verwenden die Multipart-Request-Spezifikation (graphql-multipart-request-spec) — entweder über die integrierte Upload-Unterstützung von Apollo Server oder die graphql-upload-Middleware. Dateien werden direkt aus dem Resolver nach S3 gestreamt, ohne die Festplatte des Anwendungsservers zu berühren. Alternativ implementieren wir für große oder häufige Datei-Uploads einen REST-Upload-Endpunkt neben GraphQL.

Wie setzen Sie DSGVO-Konformität in einer GraphQL-API um?

Zugriffskontrolle auf Feldebene über benutzerdefinierte Direktiven (@auth, @requiresRole), die JWT-Claims prüfen, bevor PII-Felder zurückgegeben werden. Resolver für Betroffenenanfragen, die für eine gegebene Nutzer-ID alle Daten anonymisieren oder zurückgeben. Audit-Logging von Queries — jede Query wird mit der authentifizierten Nutzer-ID und den aufgelösten Feldern protokolliert. Für EU-Deployments leitet das GraphQL-Gateway Entity-Queries zu EU-Ansässigen an EU-Region-Resolver weiter, die die Datenresidenz durchsetzen.

Wie migrieren Sie eine REST-API inkrementell zu GraphQL?

Wir verwenden die RESTDataSource von Apollo Server, um bestehende REST-Endpunkte in GraphQL-Resolver einzubinden. Das GraphQL-Schema wird zunächst auf Basis der Datenbedürfnisse der Clients entworfen, anschließend delegieren die Resolver an REST. Sobald Backend-Dienste aktualisiert werden, wechseln die Resolver von REST-Aufrufen zu direkten Datenbankabfragen. So können Frontend-Teams GraphQL sofort einführen, während die Backend-Migration über Wochen oder Monate inkrementell erfolgt.

Bauen Sie mit Senior-Entwicklern eine flexible, effiziente GraphQL-API

Antwort innerhalb von 1 Werktag. NDA auf Anfrage.

Angebot anfordern