Maintenance Mode on

Der Maintenance Mode, im deutschen Wartungsmodus, ist eine wichtige Funktion für Webanwendungen, welche häufig keine Beachtung findet. Aus diesem Grund geht es heute um genau diesen.

Die wichtigste Aufgabe des Maintenance Modes ist es, den Traffic auf eine Anwendung abzuhalten, damit diese nicht mehr ausgeführt wird.

Webanwendungen sind immer häufiger komplexe Systeme mit einem oder sogar mehreren Webservern. Dahinter verbergen sich weitere Systeme, wie Microservices oder Datenbanken. Sollte der Maintenance Mode aktiviert werden, muss die gesamte Last auf all diese Systeme verschwinden oder minimiert werden.

Technik

Wie bereits beschrieben, sollte der Maintenance Mode jegliche Last von allen Systemen nehmen und nur ein Grundrauschen zurücklassen.

Ein- und Ausschalten

Der Maintenance Mode muss zu jeder Zeit ein- und ausgeschaltet werden können. Dabei ist zu beachten, dass die Logik so simpel wie möglich sein muss. Der Mechanismus sollte nicht über eine Datenbank aktiviert werden müssen. Genauso ist ein Button in einem Admin Bereich wenig sinnvoll.

Im Zweifel muss der Maintenance Mode aktiviert werden können, wenn der Webserver unter Volllast keinerlei Abfragen mehr verarbeiten kann.

Eine mögliche Lösung wäre die Prüfung in PHP, ob eine bestimmte Datei existiert. Daraufhin kann entschieden werden ob der Maintenance Mode aktiv oder inaktiv ist.

if (file_exists('../var/maintenance-mode.lock')) {
  http_response_code(503);    
  header('Retry-After: 30');  
  exit();  
}

In diesem Codebeispiel prüfen wir bei jedem Aufruf der Webseite, ob im nebenliegenden Ordner "var" die Datei "maintenance-mode.lock" liegt. Sollte diese Datei vorhanden sein, wird der Maintenance Mode aktiv und gibt den Status Code 503 zurück. Der Status Code 503 wurde genau für einen solchen Fall definiert. Dem Browser wird zusätzlich mitgeteilt, dass dieser nach 30 Sekunden erneut prüfen soll, ob sich der Status geändert hat.

Gestaltung

Je nach Anwendung wird es sinnvoll sein, beim Wartungsmodus zwischen Requests gegen die API und allem weiteren zu unterscheiden. Sollte die Anwendung über eine API verfügen, so ist es zu empfehlen dort ein entsprechendes JSON mit Informationen zurückzugeben.

Für alle anderen Requests reicht meist eine einfach gestaltete HTML Seite. Externe Ressourcen, wie CSS, JavaScript und Bilder, sollten vermieden werden. Diese würden nur weitere Last im System verursachen.

Szenarien

Gründe einen Maintenance Mode zu haben gibt es mehrere, konkret sollen zwei Beispiele die Sinnhaftigkeit aufzeigen.

Cold Cache beim Deployment

Große Anwendungen setzen auf Caching um nicht bei jedem Request an das System Berechnungen neu ausführen zu müssen. Dadurch wird das System im Hintergrund entlastet und kann deutlich einfacher mit mehr Requests umgehen.

Wird nun eine neue Version einer Webanwendung auf dem Webserver deployed, dann hat diese Anwendung meist noch einen leeren Cache, den sogenannten Cold Cache. Erst durch die Nutzung des neuen Systems baut sich der Cache Stück für Stück auf.

PHP Frameworks wie Symfony versuchen mit Cache Warmups diesem Problem vorzubeugen. Dabei werden wichtige Teile der Anwendung vorab gecacht, unter anderem der Service Container oder YAML Konfigurationen.

Ab einer gewissen Anwendungsgröße ist es allerdings nicht mehr möglich den Cache neu aufzubauen, ohne dass gleichzeitig bereits neue Requests hinzukommen. Diese würden im Zweifel sogar versuchen parallel den Cache neu aufzubauen.

Hier bietet der Maintenance Mode eine einfache Lösung. Dieser könnte aktiviert werden, bevor die Anwendung deployed wird und würde erst nach dem Cache-Aufbau deaktiviert werden.

Webserver

Von Zeit zu Zeit kann es leider vorkommen, dass Requests im Webserver nicht schnell genug abgearbeitet werden können und nicht immer werden neue wartende Requests dann verworfen. Eine langsame Datenbankverbindung kann unter anderem ein Problem sein, diese führt dazu, dass die Requests deutlich länger benötigen als normal. Dabei kann sich das ganze System schnell hochschaukeln, um dann in einer Überlastung oder wartenden Prozessen unterzugehen.

In solchen Fällen ist es immer gut einen Maintenance Mode zu haben. Wird dieser aktiviert können alle neuen Requests schnell abgearbeitet werden und das System wird in kurzer Zeit extrem entlastet. Oft führt dies wiederum zu einer Entlastung aller anderen Systeme. Sobald sich alle entsprechenden Systeme normalisiert haben, kann der Maintenance Mode wieder deaktiviert werden.

Fazit

Es ist unschwer zu erkennen, dass ein Maintenance Mode ab einer gewissen Anwendungsgröße Vorteile bietet. Oft fällt die Notwendigkeit allerdings erst nach dem ersten Ausfall auf, dabei wäre der Einbau wie gezeigt einfach.

Neben dem Ansatz den Maintenance Mode über PHP zu steuern, kann das Problem auch früher angegangen werden. Beispielsweise im Webserver oder bei größeren Systemen bestenfalls direkt im Loadbalancer.

Wichtig ist es immer den Prozess an sich einfach zu halten. Dies gilt sowohl für das An- und Ausschalten, als auch für die angezeigte Meldung für den Nutzer.

Unter dem Punkt Technik wurden nur Anfragen über den Webserver an die Anwendung behandelt. Der Maintenance Mode muss allerdings auch vor Cronjobs oder andere Prozesse geschaltet werden, welche auf die Anwendung zugreifen.

Maintenance Mode off