Verkettung von Functions
In erster Linie lassen sich damit die Möglichkeiten der Function erweitern, um etwa mehrere Functions zu verketten, die nacheinander aufgerufen werden (F1 -> F2 -> F3 -> F4). Das ermöglicht es, mehrere Functions, die aufeinander aufbauen, weil das Ergebnis von F1 für den Aufruf von F2 benötigt, wird usw., was unter normalen Umständen nur sehr unübersichtlich und umständlich umgesetzt werden kann, einfach und übersichtlich zu gestalten. Durch die Durable-Function hat man die Möglichkeit, dies sehr übersichtlich zu gestalten, die Reihenfolge lässt sich einfach und auf einen Blick sehen.
Hiermit lassen sich auch mehrere Functions Asynchron ausführen um ein Gesamtergebnis zubekommen (F1 -> F2, F3, F4 -> F5). Man hat mehrere Functions die unterschiedlichen Aufgaben erledigen, was unabhängig voneinander auch parallel erfolgen kann, aber am Ende das Gesamtergebnis abgewartet werden muss. Hiermit kann man alle Functions Asynchron/Parallel starten und das Ergebnis zum Schluss abwarten, was entsprechend der Function-Runtime auch viel Zeit ersparen kann im Vergleich zur sequenziellen Ausführung.
Damit lässt sich z.B. ein HTTP-Call asynchron ausführen und mit Hilfe der Durable-Funktion kann man dann zur Laufzeit den Status abfragen. Wenn man auf eine fremd-API zugreift oder selbst eine HTTP-Function zur Verfügung stellt, welche für die Datenbeschaffung oder Konvertierung mehr Zeit benötigt. Wenn ein Ergebnis länger braucht, bis dieses zur Verfügung steht, lässt sich die Function per Durable-Function an triggern und während der Laufzeit kann man den Status abfragen (z.B. Running, Finish …). Wenn die Function dann fertig ist, bekommt man über dieselbe URL die Info Finish und das Ergebnis (die Antwort kommt nicht automatisch, man muss diese manuell per Status-URL abfragen).
Timeout frei einstellbar
Dies sind nur ein paar der Möglichkeiten für die Durable-Functions, wichtigster Punkt für die Durable-Function ist jedoch, dass es hierbei ein Timeout für die Ausführung gibt, welcher nicht wie bei der Standard-Function bei 10-30 min liegt. Für die Durable-Function lässt sich das Timeout variabel gestalten, sowohl 5min sind möglich als auch je nach Anwendungsfall mehrere Stunden oder Tage, sogar bis hin zu „keinem“ Timeout lässt sich dies anpassen. Dafür wird im Durable-Function-Projekt, in der Datei „Host.json“ die Zeile „"functionTimeout": "06:00:00"“ eingefügt. In diesem Fall bedeutet diese Zeile ein Timeout von 6 Stunden.
Dies kann notwendig sein, wenn man eine Function hat, die bei der Ausführung den Timeout-Rahmen für eine normale Function sprengt, weil die Ausführung 1 Stunde dauert. Dieses Timeout bezieht sich auf den Aufruf der gesamten Durable-Function, hier kann zum Beispiel ein Aufruf von 5 einzelnen Functions erfolgen, wobei F1-F4 dann 40 min Runtime haben, aber F5 benötigt nochmal für Berechnungen oder ähnliches 5 Stunden. Bei einer Standard-Function wäre die Ausführung so nicht möglich, da sich hier maximal ein Timeout von 30 min einstellen lässt. Entsprechend würde sich die Function nie testen lassen, da vor der Beendigung immer das Timeout eingreift und die Function mit Timeout beendet wird.
Fazit
Es gibt mehrere Anwendungsmöglichkeiten für eine Durable-Function, dennoch ist ihr Einsatz nicht immer sinnvoll und sollte auf den Anwendungsfall entsprechenden abgestimmt werden. Eine Durable-Function bringt viel Code zusätzlich mit, der sonst nicht benötigt wird und dies kann die Übersichtlichkeit beeinträchtigen. Hinzu kommen mehrere zusätzliche Functions in der Liste, wovon nur eine aufgerufen wird, um die Durable-Function zu starten. Des Weiteren ist das Überwachen einer Durable-Function eine sehr aufwendige und komplexe Angelegenheit, was nicht unterschätzt werden sollte, man hat die Durable-Function zu überwachen und jede einzelne Function zusätzlich.
Eine Durable-Function ist dann sinnvoll, wenn man an die Timeout-Grenze kommt oder eine Function durch verschiedene Aufgaben an Komplexität immer weiter zunimmt, weil man immer mehr Abhängigkeiten und asynchrone Aufgaben beachten und abwarten muss. Deshalb sollte immer der Aufwand und Nutzen abgewogen werden, ob eine Durable-Function verwendet werden sollte.
Florian, QUIBIQ Stuttgart