Seit der Gründung von Ackee haben wir ziemlich viele Technologien zum Implementieren unserer Serverdienste für Web- und mobile Anwendungen ausprobiert. Viele davon haben uns gefallen. Bei einigen anderen hoffen wir, dass wir sie nie wieder verwenden müssen. Sehen wir uns die Technologien an, auf die wir als Backend-Team angewiesen sind.
API, Express und Typescript
Genau wie das Frontend-Team haben wir keinen strikten Stack, sondern passen uns an den Charakter des Projekts an. Wir haben Projekte mit klassischem REST durchgeführt, bei denen wir den Code aus der Dokumentation in Open API sowie in gRPC mit der ProtoCat-Bibliothek oder in GraphQL mit Tools von Apollo generieren ließen. Der Hauptbaustein für uns bleibt jedoch das folgende Trio von Technologien: Node.js, Express und Typescript.
Wir haben uns richtig in Node verliebt und es ist unsere Haupt-Technologie geworden. Wir sehen uns auch Go intensiv an. Wir haben zwar noch wenig Produktionserfahrung damit, aber wir mögen es und glauben an sein Potenzial. Wir verwenden Express gerne, weil es im Vergleich zu anderen gängigen Frameworks minimalistisch ist. Wir können damit unsere Services sowohl an größere als auch an kleinere Projekte anpassen, die auf verschiedenen Datenbank- und API-Technologien basieren.
Für die schnelle Einrichtung unserer Projekte verwenden wir ein vorgefertigtes Node-Template. Da es schlank und transparent gehalten ist, sollten wir nie Probleme haben, es gegen etwas Neues auszutauschen. Wir stehen auch ziemlich auf das static Typing von Code mit Typescript und es ist zu einem festen Bestandteil unseres Stacks geworden. Wir checken gerne neue Technologien aus und lernen all die Tricks. Unsere neu gegründete TS-Akademie fördert das nach Kräften.
Speicherung und Übertragung von Daten
Die Basis für unsere Daten ist eine relationale Datenbank. Nachdem wir das MySQL-System verwendet haben, setzen wir seit 2019 hauptsächlich auf PostgreSQL, mit dem wir bessere Erfahrungen in Bezug auf Betrieb, Überwachung und Analyse der Komplexität von SQL-Queries gemacht haben. Die größte Hilfe bei relationalen Datenbanken ist die Library Knex.js, für die wir einen eigenen Wrapper namens Databless geschrieben haben. Wir hatten vorher auch schon versucht, den Dokumentenspeicher MongoDB zu nutzen, aber die Schwierigkeiten beim Betrieb und bei der Überwachung in der Cloud sowie die Preise für eine gehostete Lösung haben uns entmutigt.
Für größere Projekte beziehen wir andere Tools aus unserem erweiterten Stack ein. Wir nutzen gerne Firestore-Services für die Live-Synchronisation von Daten mit Web- und mobilen Apps. Für den Fall, dass die Datenbanken nicht ausreichen, verwenden wir den In-Memory-Speicher Redis für den Cache-Layer. Falls wir eine komplexere Volltextsuche benötigen, scheuen wir uns auch nicht, ElasticSearch einzusetzen. Da wir gerne mit der Architektur von Microservices spielen, benötigen wir oft ein Tool für die interne Kommunikation. Dafür setzen wir sehr gern Message-Queue Google Pub/Sub ein, für die wir auch einen eigenen Wrapper FuQu haben.
Cloud und Freigabe
Wir entwickeln unsere Dienste lokal mit Docker, wodurch wir in der Lage sind, für jedes Projekt eine Remote-Umgebung zu simulieren. Für jede dieser Umgebungen ist eine andere Konfigurationsdatei erforderlich. Da keine vorhandene Lösung für die Verwaltung von Konfigurationen unseren Anforderungen entsprach und wir das jsonc-Format verwenden wollten, haben wir unsere eigene Library geschrieben – Configuru. Wenn wir über API sprechen, darf das Testen nicht fehlen, wofür wir oft das Jest-Framework verwenden.
Der Standard für uns in Bezug auf die Freigabe und die kontinuierliche Integration ist GIT und Google Cloud. Der Code wird aus einem GIT-Repository automatisch mit Gitlab CI auf Google App Engine oder Google Cloud Run mit Anbindung des Services direkt in die Cloud-Infrastruktur ausgeliefert, die von unserem tollen DevOps-Team mit Terraform betrieben wird. Mehr dazu erfahrt ihr zum Beispiel im Artikel über Cloud Computing.
Fazit
Dies ist unser aktueller Backend-Tech-Stack. Allerdings ändern sich die Dinge ständig, weil wir gerne Neues ausprobieren und nach besseren Lösungen suchen, um unseren Kunden weiterhin das Beste zu bieten.