Was in der On-Premise Welt als «traditionell» bezeichnet wurde, nennt man heute in der Cloud-Welt «legacy». Serverless-Computing ermöglicht die nutzungsabhängige Bereitstellung von Backend-Services. Etwaige Nachteile wie Skalierbarkeit oder Kostenoptimierung können bei Serverless-Computing gezielter adressiert werden. Anhand Azure Functions erläutere ich in diesem Blog-Beitrag, wie man Serverless-Backend-Services am besten im Auge behält.
Was ist ein Serverless-Backend-Service
Ein Serverless-Backend-Service ist eine API, die hohe Skalierbarkeit, Verfügbarkeit und Kosteneffizienz bietet und eine schnelle Bereitstellung ermöglicht. Traditionell, wie etwa in einer On-Premise Lösung, wurden Backend-Services mit fest allozierten Ressourcen wie Kosten oder Memory ausgestattet. Dies hat vor allem den Nachteil, dass bei weniger Auslastung die Fixkosten bestehen bleiben und bei hoher Auslastung nicht ganz einfach skaliert werden kann. Neben Kosten und Skalierbarkeit sind eine hohe Verfügbarkeit und schnelle Entwicklung und Bereitstellung weitere Themen, die für Serverless-Backend-Services sprechen.
Zum Zeitpunkt der Erstellung dieses Blog-Beitrags bieten die führenden Cloud-Anbieter verschiedene Möglichkeiten für Serverless-Computing an. Neben serverlosen Datenbanken und Speicherlösungen stellt Google beispielsweise Cloud Functions zur Verfügung, während Microsoft Azure Functions und Amazon Lambda anbietet.
Den richtigen Tarif für Azure Functions wählen
Azure Functions bieten zum Zeitpunkt der Erstellung dieses Blog-Beitrags zwei Tarife an, Verbrauch und Premium-Tarif. Der Verbrauchstarif rechnet basierend auf dem Ressourcenverbrauch und Ausführungen pro Sekunde ab. Der Premium-Tarif bietet zusätzlich zum Verbrauchstarif erweiterte Skalierungsmöglichkeiten, feste Zuweisung von Ressourcen wie beispielsweise CPU-Kerne oder Memory und erweiterte Funktionalitäten wie Performance oder Netzwerk-Integration an.
Für die meisten Applikationen mit wenig bis mittlerem Ressourcen-Hunger sollte der Verbrauchstarif vollkommen ausreichen. Bei Anwendungen, die eine hohe Leistung, mehr Skalierung und schnellere Ausführen benötigen, könnte der Premium-Tarif geeigneter sein. Es hängt also von den Anforderungen ab, welcher Tarif am besten geeignet ist.
Kostenstruktur von Azure Functions
Die Kostenstruktur einer Azure Function setzt sich aus einer Aufrufpauschale für die Function und den Kosten für die Ausführungszeit zusammen. Diese beiden Aspekte werden als Summe in Rechnung gestellt. Die Aufrufpauschale wird bei jedem Aufruf in Rechnung gestellt und kann somit nicht beeinflusst werden, ausser dass der Aufruf aus Notwendigkeit geschehen muss. Die Ausführungszeit lässt sich jedoch beeinflussen.
Brauche ich eine Azure Function?
In erster Linie sollte man sich die Frage stellen, ob eine Azure Function überhaupt benötigt wird oder nicht. Denn wo es keine Azure Function gibt, können auch keine Kosten entstehen. Falls eine Azure Function benötigt wird, sollte man sich die Frage stellen, ob evtl. nicht bereits bestehende Azure Functions für diesen spezifischen Workload wiederverwendet werden könnten. Evtl. lässt sich eine bestehende Azure Function nach kleineren Anpassungen wiederverwenden. Durch Kombination ähnlicher Workloads müssen nicht zwingend neue Azure Functions erzeugt werden und damit kann auch die Menge der Aufrufe besser gesteuert werden. Zuletzt kann so auch die Komplexität einer Applikation positiv beeinflusst werden. Als nächstes geht es um die Optimierung der Ausführungszeit.
Verkürzung der Ausführungszeit
In der Kostenstruktur ist zu erkennen, dass die Ausführungszeit ein Schlüsselelement der Gesamtkosten ist und glücklicherweise beeinflusst werden kann. Länger andauernde Workloads erzeugen somit grössere Kosten. Laden grosser Datenmengen, warten auf externe API-Anfragen, Wartezeiten aufgrund paralleler Ausführung oder Wiederholungsversuche bei Fehlern können die Azure Functions-Kosten in die Höhe treiben. Grosse Datenbankabfragen als auch externe API-Anfragen sollten demnach spätestens beim ersten Aufruf für alle weiteren Aufrufe zwischengespeichert werden. Wartezustände aufgrund Parallelität können durch Limitierung der Parallelität für Azure Functions behoben werden. Unbehandelte Fehler im Code können Wiederholungsversuche verursachen und sollten deswegen korrekt behandelt werden.
Allgemeines Monitoring der Kosten und Performance
Grundsätzlich sollten Azure Functions immer überwacht werden. Mithilfe dem Azure Monitoring lassen sich Benachrichtigungen einrichten, um frühzeitig bei Anomalien in Kenntnis gesetzt zu werden. Nur so lassen sich Schwachstellen und Optimierungsmöglichkeiten frühzeitig finden.
Weiterführende Links zum Thema