Aufbau von APIs der Unternehmensklasse mit GraphQL, MySQL und Node.js

Unscharfes Bild von Bahngleisen mit dem in der Mitte eingeblendeten Text „GraphQL Teil 1“.

Es gibt viele Tutorials für den Einstieg in die Erstellung von GraphQL-APIs. Aber nur wenige Informationen über die Bewältigung anspruchsvollerer Probleme in einer Unternehmensumgebung.

Ist GraphQL bereit für die Produktion in großen Unternehmen?

Unser API: Schnell und stabil

Wir haben es getan und können aus vollem Herzen sagen: Ja, es ist fertig.

Wir haben eine GraphQL-API in Unternehmensqualität, die seit 6 Monaten in Produktion ist. Unsere API ist superschnell und sehr flexibel. Sie verarbeitet zuverlässig bis zu 100 Anfragen/Sekunde. Unser Kunde ist zufrieden und wir sind es auch.

In dieser Serie werden wir uns darüber austauschen, welche Muster bei der Erstellung einer unternehmenstauglichen GraphQL-API verwendet werden sollten. Wir werden die Vor- und Nachteile der verschiedenen Ansätze aufzeigen.

Sie lesen gerade den ersten Artikel dieser Serie, die sich mit unserer Architektur befasst.

Unser Ziel: Eine Community-API für nutzergenerierte Inhalte

Unser Kunde - der grösste Detailhändler der Schweiz - wollte seine Community-Software ersetzen. Nutzer können Bewertungen für Produkte und Rezepte schreiben, Fragen und Antworten stellen, in einem Forum diskutieren, Ideen für neue Produkte teilen und vieles mehr.

Das Ziel: Eine einzige API für nutzergenerierte Inhalte. Die API sollte sowohl von der Verlagsabteilung als auch von mehreren Online-Shops genutzt werden. Jeder dieser Verbraucher hatte unterschiedliche Anforderungen. GraphQL ist das perfekte Muster für ein solches Szenario.

Unsere Architektur

Das Herzstück unserer Lösung ist eine Node.js-Anwendung, die von Apollo-Server und Express. Die von unseren Nutzern generierten Inhalte werden in einer MySQL-Datenbank gespeichert. Die Nutzer- und Produktdaten werden von unserer GraphQL-API aus bereits bestehenden REST-APIs abgerufen.

Von SDL zur Erstellung unseres GraphQL-Schemas

Bei der Erstellung einer GraphQL-API mit Apollo Server sind Sie stark auf graphql-werkzeuge. Das bedeutet, dass Sie Ihre Feldauflöser getrennt vom Schema (das normalerweise in SDL geschrieben ist) definieren müssen.

Zunächst verwendeten wir SDL, um unser Schema zu erstellen. Im Laufe der Zeit wurde unser Schema immer umfangreicher und redundanter. Das führte uns zu einem anderen, eher programmatischen Ansatz anstelle des SDL-Ansatz - Ein Muster, das es uns ermöglicht, doppelten Code zu vermeiden und Schemata zusammenzustellen.

Ein allmächtiger Resolver zum Abrufen von Daten aus MySQL

Für Query Resolver haben wir einen generischen GraphQL-to-SQL-Connector erstellt. Mit einem Muster nennen wir den Allmächtiger Tröster delegiert unser Resolver die Abfrage an einen Konnektor, der GraphQL-Abfragen entgegennimmt und in SQL-Abfragen umwandelt.

Zugriff auf vorhandene REST-APIs

Wir konsumieren einige Daten von einer bestehenden REST-API. Apollo Server bietet dafür eine hilfreiche Klasse: REST-Datenquelle. Mit REST Data Source ist es super einfach, Daten von einem REST-Endpunkt abzurufen, einschließlich Caching. Leider bietet REST Data Source keine Funktion zum Löschen des Caches - das einzige, was wir für unseren Fall erweitern mussten.

Caching von GraphQL-Abfragen mit Redis

Das Caching von GraphQL-APIs ist viel komplexer als das Caching von REST-Endpunkten. Da Caching die Komplexität erhöht, haben wir uns entschieden, Daten nur für teure Abfragen zwischenzuspeichern. Wenn eine Abfrage mit einer unserer vordefinierten Abfragen übereinstimmt, antwortet unsere API mit gecachten Daten von Redis. Der Cache wird ungültig, wenn Daten aktualisiert werden.

Message Broker für verzögerte Aktionen

Um unsere Mutationen schnell und sauber zu halten, delegieren wir alle nicht zeitkritischen Aktionen (z.B. Benachrichtigungsmails) an RabbitMQ, unser Nachrichtenmakler.

Schlussfolgerung

Dies ist der Aufbau unserer API. Wir sind sehr zufrieden mit unserer Einrichtung. Seit dem Start hatten wir keine größeren Probleme mit unserer API und wir fügen ständig neue Funktionen hinzu.

In den nächsten Monaten werden wir einige der genannten Themen ausführlich behandeln. Bleiben Sie also dran und abonnieren Sie unseren Blog.

Erstellen Sie unternehmenstaugliche GraphQL-Anwendungen

Möchten Sie ein GraphQL-Profi werden? Folgen Sie uns und lesen Sie unsere ganze Serie über GraphQL-Anwendungen in Unternehmensqualität.

Benötigen Sie ein Expertenteam für die Implementierung Ihrer modernen Webanwendung? Prüfen Sie unser Portfolio.

Geschrieben von
Thomas Moser

Technology|April 2018

Weitere Artikel