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

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.
- Teil 1: Aufbau von APIs der Unternehmensklasse mit GraphQL, MySQL und Node.js
- Teil 2: Fortgeschrittene GraphQL-Patterns: Der allmächtige Wurzelauflöser
- Teil 3: Fortgeschrittene GraphQL-Muster: Machen Sie sich das AST zu eigen!
- Teil 4: GraphQL und MySQL: Die Lösung des Join-Problems
- Teil 5: GraphQL und Elasticsearch: Ein Liebesbrief 💌
- Teil 6: Die beliebtesten GraphQL Server und Clients für Node.js
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.
- Teil 1: Aufbau von APIs der Unternehmensklasse mit GraphQL, MySQL und Node.js
- Teil 2: Fortgeschrittene GraphQL-Patterns: Der allmächtige Wurzelauflöser
- Teil 3: Fortgeschrittene GraphQL-Muster: Machen Sie sich das AST zu eigen!
- Teil 4: GraphQL und MySQL: Die Lösung des Join-Problems
- Teil 5: GraphQL und Elasticsearch: Ein Liebesbrief 💌
- Teil 6: Die beliebtesten GraphQL Server und Clients für Node.js
Benötigen Sie ein Expertenteam für die Implementierung Ihrer modernen Webanwendung? Prüfen Sie unser Portfolio.

Geschrieben von
Thomas Moser
Weitere Artikel
Technology|April 2017Wenn Sie die Ersetzung einer komplexen Webanwendung vorschlagen, sollten Sie diese zehn Aspekte nicht außer Acht lassen Technology|April 2017Fünf Dinge, die Sie beachten sollten, bevor Sie eine komplexe Legacy-Webanwendung ersetzen Technology|Januar 2017Fünf Dinge, die bei der Entwicklung eines MVP mit knappem Budget zu beachten sind