Flow parallelisieren - aber richtig!

von Roland Rickborn
Flow parallelisieren - aber richtig!

Einführung

In diesem "Quick Tipp" geht es um die richtige Art, Power Automate Flows zu parallelisieren. Ich zeige, wie man Arrays filtert, wie man Daten selektiert und wie man Zwischenergebnisse richtig speichert.

Zeichenkette-Variablen als Problem bei parallelisierten Flows

Wie ich in meinem vorhergehenden Quick Tipp Microsoft Power Automate Flow parallelisieren bereits gezeigt habe, ist es oftmals sehr sinnvoll, Power Automate Flows zu parallelisieren. Mit der Gleichzeitigkeitssteuerung können "Auf alle anwenden"-Schritte (sog. For Each Schleifen) gleichzeitig in bis zu 50 parallel laufenden Prozessen abgearbeitet werden. Das Hauptproblem bei gleichzeitig ablaufenden Schleifen liegt im Speichern von Zwischenergebnissen für die weitere Verarbeitung. Verwendet man dafür einfache Zeichenfolge-Variablen, kommt es beim Schreiben und Lesen solcher Variablen unter Umständen zu Überschneidungen verschiedener Schleifen-Prozesse.

In diesem einfachen Beispiel erkläre ich die Problematik mit der Verwendung von Zeichenfolge-Variablen bei gleichzeitig ablaufenden Flows:

  1. Prozess 1 schreibt in Variable Name: 'Dahlia'
  2. Prozess 2 schreibt in Variable Name: 'Lucia'
  3. Prozess 1 liest Variable Name: 'Lucia'
  4. Prozess 2 liest Variable Name: 'Lucia'

Wie man sieht, Prozess 1 liest den für ihn falschen Wert aus der Variablen aus!

Beispiel in Flow

Dass dies genau so in Power Automate passiert, sieht man gut an diesem Flow:

Im ersten Bild sieht man den "Auf alle anwenden"-Schritt mit den enthaltenen Schritten "Variable Name festlegen" und "An Arrayvariable anfügen". Im zweiten Bild sieht man die Details dieser beiden Schritte.

Im Beispiel werden 1000 Datensätze parallel durchlaufen. Aus einem Datensatz wird jeweils der Name in der Zeichenkette-Variable Name abgespeichert. Danach wird der Wert der Zeichenkette-Variable Name an die Array-Variable Namen angehängt. Nach der For-Each-Schleife wird der Inhalt der Array-Variablen Namen angezeigt.

Das Array Namen umfasst zwar 1000 Einträge, allerdings zeigt die anschließende Überprüfung der enthaltenen Werte, dass lediglich 688 unterschiedliche Namen abgespeichert wurden. In einigen Fällen hat ein laufender Prozess also den Wert eines anderen laufenden Prozesses fälschlicherweise übernommen.

PS: Die Beispiel-Datensätze habe ich vom Random JSON Data Generator bezogen - danke.

Problemlösung bei parallelen Flows durch Datenvorgang

Anstatt Daten, die man in einem späteren Schritt weiterverwenden möchte, in einer Zeichenkette-Variablen zu speichern, ist es ratsam, solche Informationen in einem Schritt des Typs Datenvorgang zu speichern. Infrage kommende Datenvorgänge sind z.B. "Verfassen", "Auswählen", "Array filtern", "JSON analysieren" oder "Verknüpfen".

Beispiel in Flow

Im obigen Beispiel habe ich die Zuweisung des Wertes in die Variable Name entfernt und stattdessen den Schritt "Zeige Name" vom Typ "Verfassen" eingefügt. Im darauffolgenden Schritt wird der Wert aus "Zeige Name" wieder in das Array geschrieben.

Das resultierende Array Namen hat wieder die Größe von 1000 Einträgen. Aber erst die anschließende Untersuchung der enthaltenen Werte zeigt, dass wir mit dieser Lösung tatsächlich 1000 unterschiedliche Namen erfasst haben!

Bedingungen als Bremse bei parallelisierten Flows

Ein weiteres Problem, welches sogar parallelisierte Flows enorm ausbremst, ist die Verwendung eines "Bedingung"-Schritts, wie das folgende Beispiel zeigt.

Gesucht werden alle Datensätze, deren Name mit 'Dahlia' beginnt. Sobald man die JSON-Eigenschaft name zum "Bedingung"-Schritt hinzufügt, setzt Power Automate den Schritt in eine "Auf alle anwenden"-Schleife. Selbst wenn diese Schleife gleichzeitig ausgeführt wird, ist die Umsetzung mit einer Bedingung sehr langsam! Bei gleichzeitiger Ausführung mit 20 Instanzen (Standardwert) dauert die Verarbeitung von 1000 Datensätzen immer noch 2:59 Minuten. Das Ergebnis ist mit drei gefundenen Datensätzen aber korrekt!

Arrays in parallelisierten Flows filtern als Lösung

Um der Problematik mit Bedingungen aus dem Weg zu gehen, gibt es in Power Automate den Schritt "Array filtern" vom Typ Datenvorgang. Ebenfalls vom Typ Datenvorgang ist der Schritt "Auswählen", der dafür verwendet werden kann, eine bestimmte JSON-Eigenschaft eines Datensatzes auszuwählen. Beide Schritte in Kombination (ggf. mit dem weiteren Schritt "Verknüpfen", ebenfalls vom Typ Datenvorgang) führen zum Ziel, wie das folgende Beispiel zeigt:

Power Kombination: die beiden Schritte

Im ersten Schritt wird das 1000 Datensätze umfassende Array gefiltert nach allen Datensätzen, deren JSON-Eigenschaft Name mit 'Dahlia' beginnt. Im zweiten Schritt wird dann genau diese JSON-Eigenschaft ausgewählt. Die gesamte Verarbeitung dieses Flows, der natürlich ebenfalls zu drei gefundenen Datensätzen führt, dauert 915 ms. Durch Filtern und Auswählen haben wir also eine enorme Geschwindigkeitszunahme erreicht!

Fazit zum richtigen Parallelisieren von Flows

Gleichzeitig ablaufende Flows (besser: gleichzeitig ablaufende Schleifen von Flows) führen zu einer enormen Geschwindigkeitszunahme. Allerdings nur, wenn unnötige Schleifen vermeidet, keine Bedingungen verwendet und das Power-Duo bestehend aus "Array filtern" und "Auswählen" verwendet werden.

Zurück

© 2006-2024 exensio GmbH
Einstellungen gespeichert

Datenschutzeinstellungen

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell, während andere uns helfen, diese Website und Ihre Erfahrung zu verbessern.

Sie können Ihre Einwilligung jederzeit ändern oder widerrufen, indem Sie auf den Link in der Datenschutzerklärung klicken.

Zu den gesetzlichen Rechenschaftspflichten gehört die Einwilligung (Opt-In) zu protokollieren und archivieren. Aus diesem Grund wird Ihre Opt-In Entscheidung in eine LOG-Datei geschrieben. In dieser Datei werden folgende Daten gespeichert:

 

  • IP-Adresse des Besuchers
  • Vom Besucher gewählte Datenschutzeinstellung (Privacy Level)
  • Datum und Zeit des Speicherns
  • Domain
You are using an outdated browser. The website may not be displayed correctly. Close