GraphQL
Inhaltsverzeichnis
Was ist GraphQL?
Bei GraphQL handelt es sich um eine Schnittstelle zur Übertragung strukturierter Daten zwischen verschiedenen Anwendungen. Das Ursprünglich von Facebook entwickelte GraphQL stellt gleichermaßen eine API-Beschreibung als auch eine Abfragesprache dar. Die Bedeutung geht inzwischen weit über Facebook hinaus, da sich GraphQL zu einer wichtigen Konkurrenz für SOAP und REST entwickelt hat. Seine Stärken kommen insbesondere dann zum Tragen, wenn es um aufwändigere Anfragen geht.
Überblick und Allgemeines
GraphQL ist seit seiner Entwicklung durch Facebook im Jahr 2012 im Einsatz. Als Abfragesprache nutzt sie nur eine URL für sämtliche Abfragen. Dies ist eine Eigenschaft, die es etwa von REST unterscheidet. Aus diesem Grunde ist es für Entwickler nur erforderlich, ein Schema mit abfragbaren Typen für eine GraphQL-Struktur zu entwerfen.
Dazu gehören die Funktionen, mit denen sich Anfragen zu diesen Typen auslösen lassen. Auf diese Weise wird gewährleistet, dass die API zum größten Teil selbstdokumentierend ist. Hierbei existieren Bibliotheken für Clients und Server in nahezu sämtlichen Programmiersprachen, wobei die Node.js-Implementierung besonders weite Verbreitung hat, da sie sich auf einfache Weise in Server oder Anwendungen (etwa Express.js) einbinden lässt.
Die Abfragesprache beherrscht lesende wie auch schreibende Operationen für Web-Applikationen. Das ursprüngliche Entwicklungsziel seitens Facebook war es, Datenmaterial für mobile Anwendungen vom Server zu laden. Der Anspruch bestand darin, diesen Prozess so einfach wie möglich zu gestalten. Entwickler sollten die Abfragesprache schnell erlernen können.
Einordnung
GraphQL stellt weniger ein spezifisches Produkt dar, sondern mehr eine Idee, die sich in mehreren Sprachen umsetzen lässt und inzwischen auch in zahlreichen Sprachen realisiert worden ist. So finden sich etwa Java-Implementierungen oder auch Umsetzungen mit PHP und Go.
Grundsätzlich ist GraphQL auf einer Ebene mit SOAP und REST einzuordnen. Die Sprache findet Einsatz bei der Formulierung von Anfragen an einen Server. Hierbei ist die konkrete Implementierung der Applikationslogik nicht Gegenstand der Schnittstelle selbst.
Auch in einer bereits bestehenden Applikation kann es zur Anwendung kommen, wobei es nicht erforderlich ist, größere Bestandteile des Quellcodes zu ersetzen.
In der modernen Entwicklung von Web-Services und Backends hat REST als Architekturstil große Verbreitung erfahren. Doch ist die RESTful-Architektur nicht zwingend in jeder Aufgabe der optimale Lösungsansatz. Gerade aufgrund der spezifischen Anforderungen mobiler Clients kam es zur Entwicklung GraphQLs, dessen Anwendungsbereich daher deutlich über Facebook hinausgeht.
In Abgrenzung zu REST ist es bei GraphQL nicht vorgesehen, sämtliche Ressourcen über eine je eindeutige URL anzusprechen. Anders als dort gibt es bei GraphQL lediglich eine einzige URL für alle Daten. Bei der Abfrage kommt eine Zeichenkette in strukturierter Form zum Einsatz. Diese Zeichenkette dient gleichermaßen der Vorgabe der Antwortstruktur.
Funktionsweise
GraphQL basiert auf einem bestimmten Schema, das von einem Server zur Verfügung gestellt wird. Das Schema ist über die Interface-Definition-Language (IDL) beschrieben und arbeitet gemäß Schema-First-Ansatz.
Das heißt, dass zunächst ein Vertrag zwischen Client und Server durch das Schema festgelegt wird, während die Daten im Fokus stehen. Im Rahmen des klar typisierten Schemas sind verschiedenartige Datentypen vorgesehen.
Dazu gehören einfachere Typen wie Float, Int, ID oder Boolean, jedoch auch aufwändigere und geschachtelte Objekttypen, die über eigene Felder verfügen. Ebenso bezeichnet das Schema bestimmte Operationen, die Anwendung auf den Objektgrafen finden können.
Grundsätzlich ist bei den Operationen zwischen lesenden und schreibenden Vorgängen zu unterscheiden. Lesende Operationen werden auch Queries genannt, während schreibende Operationen unter der Bezeichnung Mutations bekannt sind. Die Interface Definition Language ermöglicht ebenfalls eine Beschreibung der Operationen. Auf diese Weise ist es möglich, verfügbare Operationen als zusätzliche Elemente des Schemas zu definieren.
Eigenschaften und Abgrenzung
Für den gelingenden Einsatz von GraphQL ist es wichtig, die Charakteristika zu kennen, mit denen es sich von REST oder SOAP abgrenzt. Grundsätzlich gibt die Anfrage bereits die Struktur der Antwort vor. Der angefragte Server liefert hierbei lediglich die Felder, die der Client bereits im Rahmen der Anfrage angibt.
Weiterhin ist GraphQL eine Abfragesprache, die mit eigenständigem Datentypsystem arbeitet. Entwickler legen bestimmte Datentypen auf Seiten des Servers fest. Hierbei basiert ein Datentyp auf einem Feld oder mehreren Feldern.
Diese können wiederum mit Typangaben versehen werden. Die Datentypen geben den Rahmen für Abfragen vor, indem sie die Datenstrukturen schaffen. Aufgrund dieses Typsystems handelt es sich bei GraphQL um ein weitestgehend selbstdokumentierendes System.
Über Anfragen lassen sich das vollständige Schema sowie auch die Struktur einzelner Typen auslesen. Aufgrund dessen ist eine vollumfängliche Beschreibung der Schnittstelle möglich.
GraphQL ist ein dynamisches System, das keiner Versionierung der Schnittstellen mehr bedarf. Bestehende Aufgaben werden nicht durch neue Felder beeinflusst. Solche Felder, die nicht mehr benötigt werden, können Entwickler entsprechend markieren. Diese Markierungen lassen sich durch Introspektion auslesen und bei Bedarf zu späteren Zeitpunkten löschen.
Optimierung der Performance
Clientseitig kann GraphQL innerhalb des festgelegten Schemas den Umfang einer Antwort frei definieren. Es kann zu einer Herausforderung werden, die Anfragen im Server schnell und effizient abzuarbeiten. Die Anforderungen wachsen insbesondere, wenn es sich um die Anfrage einer Vielzahl geschachtelter Felder handelt. Auch Zugriffe auf nachgeschaltete Backend-Systeme können zu Performance-Problemen führen.
Aus diesem Grunde finden sich mehrere Ansätze, die Performance des GraphQL-Servers zu optimieren. Geht es um den Java-Bereich, lassen sich Zugriffe mit dem java-dataloader zur Optimierung der Zugriffe nutzen.
Diese Bibliothek lässt sich einsetzen, um Anfragen an Datenbanken oder Web-Services zusammenzufassen oder zu parallelisieren. Ebenso lassen sich auf diese Weise redundante Zugriffe eliminieren. Sobald ein Objekt zwei- oder mehrfach in der Antwort des Servers auftaucht, ist nur ein einmaliges Laden erforderlich.
Zu berücksichtigen ist, dass es auch im Falle einer entsprechenden Performance-Optimierung bei aufwendigen Anfragen zu einem Time-out im Rahmen der Verarbeitung kommen kann. Ein Lösungsansatz besteht darin, solche Anfragen bereits vor der Ausführung im Hinblick auf ihren Aufwand zu beurteilen und gegebenenfalls zurückzuweisen.
Sie haben noch Fragen?