quiNews

Was Sie Gutes mit uns verbinden können

Logic App Connection Error 429 (TooManyRequests) vermeiden

Auf welchen Wegen man ein 429 (TooManyRequests) bei Logic Apps Connections vermeiden kann? Dafür schauen wir uns ein Szenario eines unserer Kunden an.

 

Der Kunde wollte jede Nacht eine größere Menge an Dateien von einem lokalen System in einer Logic App verarbeiten. Die Logic App sollte automatisch getriggert werden, wenn eine Datei in einem bestimmten Ordner abgelegt wird anschließend sollte die Datei einlesen, archivieren und gelöscht werden. Bei unseren Recherchen wie wir dies am besten umsetzen stießen wir auf das On-premises Data Gateway in Verbindung mit dem File System Connector. Schnell war eine erste Logic App gebaut.

Beim ersten Last-Test gab es jedoch Probleme. 

Laut Dokumentation sollten wir diesen Fehler bekommen, wenn innerhalb von 60 Sekunden eine Connection mehr als 100-mal aufgerufen wird. Wir hatten aber bei weitem keine 100 Runs der Logic App geschafft.
Um dem Problem besser auf den Grund zu gehen stellten wir zeitweise die Retries ab. Nun kamen wir reproduzierbar auf ~25 Runs bevor es ein Fehler gab. Unser erster Fehler war das jede Action die gleiche Connection benutzte, so dass wir pro Logic App Run schon 4 Aufrufe verbrauchten. Deswegen erstellten wir nun 4 verschiedene Connections und jede Action nutzte eine andere Connection, so kamen wir nun auf die erwarteten 100 Runs. 

Da der Prozess nicht Zeitkritisch war, mussten wir jetzt nur noch einen Weg finden wie wir den Durchsatz steuern konnten, dabei kamen uns auch Ideen wie ein Mini-Service auf dem Lokalen System laufen zu lassen, der die Dateien zwischen speichert und die Logic App nur mit so vielen Dateien füttert wie sie verträgt. Jedoch verwarfen wir die Idee recht schnell wieder da wir dann den Service hätten separat monitoren müssen. Die Lösung, die wir wählten war eine Kombination aus der Beschränkung der Anzahl der Instanzen in Verbindung mit einem ein Delay. Da 50 parallele Instanzen das Maximum sind was man einstellen kann, wählten wir ein Delay von 30 Sekunden.


Somit schafften wir nun nur noch 100 Runs innerhalb von 60 Sekunden was gleichbedeutend war das keine 429er mehr auftraten und die Dateien langsam aber sicher verarbeitet wurden. Wenn man jetzt mehr Runs benötigt muss man auf einem kleinen Hack zurück greifen. 

In der Code View sah es bisher so aus:

"$connections": {

  "value": {

    "filesystem_1": {...}

        […]

  }

},

"definition": {

  “actions": {

    "Copy_file": {

      “inputs": {

        "host": {

          "connection": {

            "name": "@parameters('$connections')['filesystem_1’]['connectionId']"

[...]

Wenn man jetzt aber die Anzahl der Connection zum Beispiel verdreifacht, dann man mithilfe der Rand-Function pro Run zufällig eine der 3 Connections verwenden. 

 

"$connections": {

  "value": {

    "filesystem_1": {...},

    "filesystem_2": {...},

    "filesystem_3": {...}

  }

},

"definition": {

  “actions": {

    "Copy_file": {

      “inputs": {

        "host": {

          "connection": {

            "name": "@parameters('$connections')[concat('filesystem_', rand(1,3))]['connectionId']"

[...]

Dabei muss man aber bedenken das man nur zufällig zwischen den 3 wählt und man so trotz 3 Connections nicht die 3fache Menge an Dateien verarbeiten kann. Zudem kann man nun nicht mehr den Logic App Designer verwenden, sondern nur noch die Code View. Wenn einem das nicht stört, hat man aber seinen Durchsatz ca. verdoppelt. 

Links:

 

Dieser Technik-Tipp kommt von QUIBIQ Berlin.
Autor ist Mathias Gontek.

 

© QUIBIQ GmbH · Impressum · Datenschutz