- Nach 6 Jahren Einsatz seit 2018 bin ich zwar ein echter GraphQL-Enthusiast gewesen, inzwischen aber skeptisch geworden.
- Ich möchte erklären, warum ich GraphQL heute nicht mehr empfehle und was ich für die bessere Alternative halte.
Angriffsfläche
- GraphQL birgt das Risiko, durch das Offenlegen einer Abfragesprache die Angriffsfläche zu vergrößern.
- Besonders wichtig sind dabei Probleme rund um die Autorisierung.
- Für jedes Feld sind angemessene Berechtigungsprüfungen erforderlich.
- Bei einer REST API ist es einfacher, die Berechtigungen pro Endpoint zu prüfen.
Autorisierung
- Für jedes Feld müssen die Benutzerberechtigungen geprüft werden.
- Bei einer REST API ist es einfacher, die Berechtigungen pro Endpoint zu prüfen.
Rate Limiting
- GraphQL-Abfragen haben keine feste Größenbegrenzung und können den Server stark belasten.
- Eine mögliche Methode ist, die Komplexität von Abfragen zu schätzen und Queries zu begrenzen, die eine bestimmte Komplexität überschreiten.
- Bei einer REST API ist es einfacher, die Anzahl der Requests zu begrenzen.
Query-Parsing
- Fehlerhafte Query-Strings können dazu führen, dass der Server übermäßig viel Speicher verbraucht.
- Eine Möglichkeit ist, eine maximale Fehleranzahl festzulegen, um das Parsing abzubrechen.
Performance
Datenabruf und das N+1-Problem
- Field Resolver können externe Datenquellen mehrfach aufrufen.
- Mit dem Dataloader-Pattern lässt sich dieses Problem lösen.
- Bei REST ist es einfacher, das N+1-Problem im Controller zu lösen.
Autorisierung und das N+1-Problem
- Autorisierungscode kann das N+1-Problem verursachen.
- Bei REST tritt dieses Problem nicht auf.
Kopplung
- In GraphQL-Codebasen ist die Business-Logik stark an die Transportschicht gekoppelt.
- Integrationstests sind notwendig, und Debugging ist schwierig.
Komplexität
- Verschiedene Methoden zur Lösung von Sicherheits- und Performance-Problemen in GraphQL erhöhen die Komplexität der Codebasis.
- REST-Lösungen sind in der Regel einfacher.
Alternativen
- Empfohlen wird eine JSON-REST-API mit OpenAPI 3.0+.
- Wenn Clients in einer statisch typisierten Sprache geschrieben sind, kann OpenAPI die bessere Wahl sein.
- OpenAPI kann automatisch typsicheren Client-Code generieren.
Meinung von GN⁺
- GraphQL ist leistungsfähig, aber die Lösung von Sicherheits- und Performance-Problemen erfordert viel Aufwand.
- REST APIs sind vergleichsweise einfach und in vielen Fällen besser geeignet.
- OpenAPI bietet Typsicherheit und automatisierte Tools, die die Entwicklerproduktivität steigern können.
- Bei der Einführung von GraphQL sollten Sicherheits- und Performance-Probleme sorgfältig berücksichtigt werden.
- Es ist wichtig, die Vor- und Nachteile von REST und GraphQL zu vergleichen und die passende Technologie für das jeweilige Projekt auszuwählen.
8 Kommentare
GraphQL ist irgendwie nervig (2022)
Die Ära des RPC-Hypes beginnt.
Na klar … nur weil etwas schick und fancy daherkommt, sollte man nicht sofort zuschnappen und es in den Himmel loben. Jetzt ist wohl das ORM an der Reihe. Dein Ende ist auch nicht mehr fern …
ORMs gibt es inzwischen seit mehr als 20 Jahren ...
2018 war PQ wohl auch nicht mehr besonders neu (tatsächlich wurde es schon empfohlen, als GraphQL erstmals vorgestellt wurde), daher ist es überraschend, dass man es 6 Jahre lang nicht ausprobiert hat...
GraphQL komplett in Eigenregie zu implementieren, ist aus allen oben genannten Gründen in Bezug auf Komplexität und Stabilität schwierig. Es scheint besser zu sein, eine Layer wie Hasura oder PostGraphile über die Datenbank zu legen und je nach Bedarf entweder GraphQL oder REST zu dieser Layer hinzuzufügen.
Hacker-News-Kommentare
graphql-codegenwurden Typen und Funktionen für Vue 3 erzeugt. Es gab einige Probleme, aber auf Typebene wurden viele Fehler abgefangen.