Zunächst kurz zu uns: Wir, Phillip Fehrmann und Manuel Styrsky sind beide als Werkstudenten in der Software Entwicklung bei Opitz Consulting Deutschland GmbH beschäftigt und haben uns um Zuge dessen in das Thema GraphQL eingearbeitet und dabei auch ein Backend für eine kleine Chat-App auf Basis von GraphQL entwickelt. In dieser Blogserie wollen wir auf die Punkte von GraphQL eingehen, die uns während dem Projekt besonders aufgefallen sind und vor allem Unterschiede zu REST ausarbeiten.
Was ist GraphQL?
GraphQL ist eine neuere Schnittstellentechnik und soll als Query Language für Schnittstellen eine Alternative zu REST darstellen. GraphQL kann in jeder Programmiersprache in Kombination mit beliebigen Datenbanken und anderen Datenquellen umgesetzt werden, viele Frameworks und Codebeispiele sind jedoch in JavaScript gehalten, ebenso die Referenzimplementierung von GraphQL. Dabei werden Anfragen an die Schnittstelle in Form von Queries gestellt, die der Client nach seinen Datenbedürfnissen aufsetzt und die anschließend vom Server bearbeitet werden. Antworten werden entsprechend der Anfragen als JSON-Objekte zurückgegeben und enthalten nur die angefragten Daten. Die Vorteile sind unabhängigere, flexiblere Clients, weniger Anfragen an den Server und keine Übermittlung ungenutzter Daten. Einen genaueren Vergleich mit REST, in dem wir näher auf Vor- und Nachteile eingehen, kommt demnächst in dieser Blogserie.
Unsere Demo Anwendung
Um das Thema zu vertiefen und gleichzeitig eine GraphQL-Schnittstelle zu entwickeln, haben wir eine kleine Demo-Anwendung geschrieben, die einen einfachen Backend Server für eine Chat-App darstellt. Diese läuft als NodeJS Server mit dem Apollo Framework und einer MariaDB SQL-Datenbank und wurde in TypeScript geschrieben. Bei der Entwicklung des Backends haben wir einige Techniken zur Entwicklung von GraphQL-Schnittstellen ausprobiert, sind auf Hindernisse gestoßen, haben Lösungen gefunden und stießen natürlich auch auf Probleme, die wir noch nicht lösen konnten. So haben wir uns unter anderem mit Caching, Batching mit dem Dataloader, Ratelimiting, Authorization und Monitoring beschäftigt. Auch Schema Stitching und Remote Schemas haben wir mit zwei Microservices und einem Gateway genutzt. Zu all diesen Themen veröffentlichen wir nun demnächst tiefer gehende Blogeinträge.
Unsere Einschätzung
Grundsätzlich halten wir die Idee hinter GraphQL für sehr nützlich: Ein Client bestimmt die Daten, die ein Server liefert und dieser benötigt dazu nur sehr wenige Aufrufe. Jedoch sind Dokumentationen und Lösungen zu Problemen bei GraphQL an vielen Stellen noch sehr unausgereift. Meist können zwar einfache Teilprobleme mit wenig Aufwand bewältigt werden, während andere Problemfälle nicht abgedeckt werden.
Um die verschiedenen Probleme und unsere Lösungen dazu geht es in den folgenden Einträgen. Dranbleiben lohnt sich!