Flow:ssa silmukoiden (Apply to each) suoritukseen saa kummasti vauhtia, kun sallii silmukan sisältöjen suorittamisen rinnakkain (concurrency).

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.

paraller sp list

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

update basic

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.

paraller wrong

Kyllä. Mokasimme juuri.

Käynnistetään Flow.

Lopputulos on juuri sitä mitä haluammekin, mutta Flow:n suoritus kestää kovin kauan (pahimmillaan melkein 2 minuuttia).

paraller result ok

Lisätään suoritukseen vauhtia sallimalla silmukan (Apply each item) suoritus rinnakkain, max 25 suoritusta kerrallaan.

add concurrency

Vauhtia tuli lisää, mutta miltä näyttää SharePoint-lista?

Siellä on hurja määrä rivejä, joilla on väärä arvo omistajan nimen kohdalla.

sp list wrong

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.

paraller right

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.

child flow

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.

parent flow

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.