Hinter den Kulissen von Plan B

Bald ist das zweite Schuljahr rum, in dem Plan B (vormals VPlan SGS) im täglichen Schuleinsatz ist. Derzeit stehen tiefliegende und grundsätzliche Änderungen an den Innereien an. Den ersten großen und sehr zeitaufwändigen Schritt Richtung Zukunftssicherheit habe ich nun im Wesentlichen beendet. Worum es bei Update Nummer 411 (Version 4.19) geht will ich kurz darstellen.

Eins ist klar: Im Idealfall sollte man von Update 4.19 nichts mitbekommen. Denn die Änderungen spielen sich vor Allem serverseitig ab.

Viel Work am Framework

Plan B basiert auf dem fantastischen Meteor JS Framework. Das ist ein Full-Stack Javascript Framework, welches das Javascript im Browser / in der Webview (rote App) interpretiert und serverseitig in einer NodeJS Umgebung läuft. Node JS ermöglicht es, Javascript Code ohne Browser auszuführen und ist bekannt dafür, eine große Zahl gleichzeitiger Netzverbindungen schnell und ressourcenschonend verwalten zu können.

Meteor hat schon ein paar Jahre auf dem Buckel. Als das Open Source Framework 2012 veröffentlicht wurde, was NodeJS noch nicht nativ in der Lage, asynchronen Code ausführen zu können.

Daher wählte Meteor das Paket Fibers zur Ausführung von asynchronem Code. Fibers stütze sich im Jahr 2011 auf einige undokumentierte, interne Funktionen von NodeJS v0.1.*, genauer gesagt der v8 Engine, um unabhängige, parallele Ausführung von Programmbestandteilen zu ermöglichen.

Also läuft jede Aktion auf einem Meteor Server in einer Fiber. In Plan B sind das z.B. Methoden zum Importieren von Vertretungsinfos, Abmelden von Schülern, Eintragen von Raumänderungen etc. Besonders das Beispiel „Importieren von Vertretungsinfos“ zeigt, dass es wichtig ist, code asynchron auszuführen: Eine synchrone Bearbeitung würde den gesamten Serverthread blockieren. Es könnten keine Anfragen bearbeitet werden, bis der Import abgeschlossen ist. In Wirklichkeit ist es so, dass man nach dem Upload der Plandaten alles mögliche andere erledigen und sogar den Browser schließen kann, während der Import im Hintergrund weiterläuft.

Breaking changes

Ab Node Version 16 gibt es kein Fibers mehr. Da sich die interne Struktur der v8 Engine mit dieser Version geändert hat, ist Fibers nicht mehr kompatibel mit NodeJS 16.

Mittlerweile hat sich in der JavaScript-Welt natürlich auch einiges getan. Asynchrone Code Ausführung ist dank Promises und noch hübscher via async-await Standard. Es braucht also auch keine Fibers mehr.

Was also zu tun ist, ist schnell gesagt, und langsam getan: Fibers durch async ersetzen.

Das hat enorme Folgen: Jede asynchrone Funktion muss geändert werden. Und da bei Plan B mehr als 95% aller Funktionen asynchron ausgeführt werden, bedeutet das, dass im Grunde die vollständige Serverlogik überarbeitet werden muss. Denn jede Datenbankabfrage, jeder API Request ist asynchron.

Die Arbeit an den Servermethoden ist mittlerweile abgeschlossen. Es wurden fast 600 Dateien Zeile für Zeile überarbeitet.

Safety first

Um sicherzustellen, dass sich bei einem derart umfassenden Umbau keine „major Bugs“ einnisten, habe ich für jede der Servermethoden „unit und integration tests“ geschrieben.

Hierzu werden per Skript zufällige Beispieldaten generiert. Ein Test definiert außerdem, was der erwartete Zustand der Datenbank und des Servers nach dem Aufruf der jeweiligen Methode ist. Falls das Ergebnis der Methode wie erwartet ist, gilt der Test als bestanden. Falls nicht wird ein Fehler gemeldet, und es kann gezielt nachgearbeitet werden. Mittlerweile sind so Tests für über 450 Methoden zusammengekommen.

Die Codeverwaltung und das Deployment von PlanB habe ich dann noch so umgestellt, dass ein Update nur nach erfolgreichem Durchlaufen aller Tests erfolgen kann.