Flow:ssa silmukoiden (Apply to each) suoritukseen saa kummasti vauhtia, kun sallii silmukan sisältöjen suorittamisen rinnakkain (concurrency).
Tällöin silmukan sisältöjä ajetaan samanaikaisesti, max 50 kappaletta kerrallaan.
Huikeaa. 50 kertainen nopeus!
Rinnakkaisuus voi kuitenkin johtaa ikävään yllätykseen, mikäli ei tiedä mitä on tekemässä.
Avataan tätä esimerkillä.
50 rivin päivittäminen
Luodaan SharePoint-lista, jonka Owner-sarakkeeseen tallennetaan sähköpostiosoite.
Haluamme tallentaa listan Owner display name -sarakkeeseen sähköpostiosoitetta vastaavaan henkilön näyttönimen .
Tämä onnistuu helposti Flow:lla.
- haetaan listan kaikki rivit
- kunkin rivin kohdalla haetaan Owner-kentän sähköpostiosoitetta vastaava käyttäjäprofiili (Get user profile)
- tallennetaan käyttäjäprofiilin näyttönimi Owner display name -kenttään
Mutta… Flow menee virheeseen, mikäli listassa on sähköpostiosoite, jota ei löydy Azure Ad:sta.
Muutetaan Flow:ta hieman. Tallennetaan haettavan käyttäjän nimi muuttujaan. Mikäli käyttäjää ei löydy (Get user profile -toiminto palauttaa virheen), tallennetaan muuttujaan nimeksi ”Unknown”.
Lopuksi tallennetaan listan riville muuttujan arvo.
Kyllä. Mokasimme juuri.
Käynnistetään Flow.
Lopputulos on juuri sitä mitä haluammekin, mutta Flow:n suoritus kestää kovin kauan (pahimmillaan melkein 2 minuuttia).
Lisätään suoritukseen vauhtia sallimalla silmukan (Apply each item) suoritus rinnakkain, max 25 suoritusta kerrallaan.
Vauhtia tuli lisää, mutta miltä näyttää SharePoint-lista?
Siellä on hurja määrä rivejä, joilla on väärä arvo omistajan nimen kohdalla.
Miten tämä voi olla mahdollista?
Syyllinen on silmukan sisällä käyttämämme muuttuja. Silmukkaa ajetaan nyt rinnakkain, mutta rinnakkaiset suoritukset käyttävät edelleen yhtä ja samaa yhteistä muuttujaa.
SharePoint-listaa päivittäessä, joku rinnakkaisista suorituksista on ehtinyt päivittää muuttujan arvon toiseksi.
Tarkista siis aina, ettei silmukoiden sisällä käytetä muuttujia, mikäli kosket Concurrency control -asetukseen.
Korjausvaihtoehto 1 – Toteutus ilman muuttujia
Ratkaisu ongelmaan on tietenkin helppo. Hankkiudutaan eroon muuttujasta.
Näin voimme suorittaa silmukkaa turvallisesti rinnakkain.
Korjausvaihtoehto 2 – Child Flow
Toinen tapa ratkaista ongelma on eristää silmukan sisältö omaan Flow:hun, jota kutsutaan silmukan sisältä. Tämä on kätevää mikäli silmukan sisällä on enemmän logiikkaa.
Child Flow:den avulla voit siis toteuttaa uudelleenkäytettäviä funktioita.
Aloitetaan tekemällä painikkeesta käynnistyvä Flow, joka saa parametrina sähköpostiosoitteen ja hakee sitä vastaavan henkilön nimen. Lopuksi Flow palauttaa kutsujalleen löytämänsä nimen.
Seuraavaksi teemme Flow:n, joka käy läpi SharePoint-listan rivit. Jokaisen rivin kohdalla se käynnistää juuri luomamme Flow:n. SharePoint-listalle tallennetaan käynnistetyn Flow:n palauttama näyttönimi.
Nyt voimme asettaa rinnakkaisuuden maksimiin ja 50 rivin päivitys kestää ainoastaan 4 sekuntia. Jokainen rivi saa edelleen oikean arvon.
Huomaa että Flow voi kutsua toista Flow:ta ainoastaan, mikäli molemmat Flow:t ovat ratkaisupaketin (solution package) sisällä.
Muuta huomioitavaa
Rinnakkaisuutta hyödyntäen on mahdollista rakentaa Flow, joka käyttää yhdistimiä (esim lisää rivejä SharePointiin) liian nopeasti. Tällöin yhdistimen käyttöä rajoitetaan (throttle) ja tavoiteltu nopeushyöty kääntyykin päälaelleen.
Suoritus onkin entistä hitaampaa.