[Ohjelmistoarkkitehtuuri] Putkiston suunnittelumalli – nollasta sankariksi

Tässä artikkelissa tarkastelemme erilaisia tapoja toteuttaa putkiston suunnittelumalli alkaen perusasioista monimutkaisempiin ratkaisuihin.

Putkiston malli

Putkiston malli on ohjelmistojen suunnittelumalli, joka tarjoaa mahdollisuuden rakentaa ja suorittaa toimintojen sarjan.

https://www.hojjatk.com/2012/11/chain-of-responsibility-pipeline-design.html

Tätä mallia on parempi käyttää yhdessä liitäntäkuvion (plugin pattern) kanssa, jolloin putkisto rakennetaan dynaamisesti sovelluksen käynnistyessä.

Sekvenssi

Putkiston yksinkertaisin toteutus olisi yksinkertainen operaatioiden sekvenssi.

Operaation rajapintaa voidaan kutsua datan käsittelyyn.

Putkisto käsittelee jokaisen operaation yksi kerrallaan. Putkilinjaluokka toteuttaa myös IOperation-rajapinnan, joten ne voidaan yhdistää.

Operaatio voidaan kirjoittaa omaan luokkaan.

Tai käyttää wrapperiä, jolla operaatio luodaan automaattisesti lambdasta.

Putkiston operaatiot tulee rekisteröidä ennen kuin putkistoa kutsutaan.

Katkaisija

Ensimmäinen ominaisuus, joka putkistoon halutaan lisätä, on katkaisija.

Jokainen operaatio palauttaa tuloksen : fail tai success.

Jos operaatio epäonnistuu, putkilinjan suorituksen pitäisi pysähtyä.

Asynkroninen

Toinen vaatimus voisi olla, että putkilinja pystyy käsittelemään asynkronisia operaatioita.

Jokainen operaatio joutuu nyt kutsumaan seuraavaa operaatiota putkistossa, kun ne ovat lopettaneet tietojen käsittelyn.

Putki on hieman monimutkaisempi, koska sen täytyy asettaa seuraava operaatio, kun uusi operaatio rekisteröidään. Toinen ratkaisu on käyttää rakentajaa.

Tämä operaatio on asynkroninen ja se suoritetaan erillisessä säikeessä, ja kun aika loppuu, se kutsuu seuraavan operaation jatkamaan putkistoa.

Yleistä operaatiota voidaan käyttää sekä yksinkertaisella toiminnolla että käyttämällä sisäänrakennettua katkaisijaa, jos käytät funktiota.

Tässä yksinkertaisessa esimerkissä käytetään useita toteuttamiamme ominaisuuksia.

Nyt tiedät, miten putkistosta tehdään asynkroninen !

Olisikin vielä parempi, jos sinulla olisi toinen takaisinkutsu edelliselle operaatiolle, jotta saisit tuloksen kulkemaan vastavirtaan putkiston läpi.

Plugin

Huippusyy putkistosuunnittelumallin käyttämiseen on usein vaatimus pystyä lisäämään liitännäisiä, jotka joko liittävät operaatioita olemassa olevaan putkeen tai koukuttavat operaation keskelle sitä.

Putkisto on todella yksinkertainen, mutta tällä kertaa operaatiot paljastetaan.

Otetaan yksinkertainen sovellus, jossa on putkisto, joka näyttää konsolissa vain 3 vaihetta. Tämä sovellus tukee myös liitännäisiä, joilla voidaan muokata putkea.

Ensimmäinen liitännäinen koukkaa toisen operaation putken toiseen aukkoon.

Toinen liitännäinen liittää uuden operaation putken loppuun.

Sovellus ja liitännäiset on koottu yhteen, voimme kutsua putkistoa.

Eräajo

Muuten käyttökelpoinen piirre on pystyä käsittelemään samassa putkistossakin eräkohtaista dataa yksittäisten kohteiden sijaan.

Eräkohtainen putkisto kietoo putkiston ja kutsuu jokaista operaatiota jokaiselle kohteelle.

Jokainen kohde kietoutuu putkistoon, joten voimme muistaa katkaisijan tuloksen.

Tällä operaatiolla tarkistetaan, onko kokonaisluvulla vaadittu suuruusluokka.

Putkisto tarkistaa kokonaislukujen erän suuruusluokan.

Putkisto kutsuu seuraavan operaation vain sellaisille kohteille, jotka eivät ole epäonnistuneet.

High Performance Pipeline

Putkiston suunnittelumallilla voidaan viitata myös paljon spesifimpään ja suorituskykyyn tähtäävään ohjelmistorakenteeseen.

Jotkut projektit käyttävät putkilinjaa optimoidakseen valtavan tietomäärän käsittelyn suorittamalla jokaisen putkilinjan operaation omassa säikeessä.

Jokainen säie kuluttaa ja tuottaa dataa samanaikaisesta jonosta, joka toimii puskurina.

Tällä kertaa käytämme asynkronisia operaatioita, joissa on katkaisija.

Jos operaatio onnistuu, sen pitäisi kutsua seuraava, tai lopettaa, jos epäonnistuu.

Putkisto on suunniteltu ohittamaan katkaisija. Onnistui tai epäonnistui, se jatkaa aina vanhemman putkiston sekvenssiä ja kutsuu seuraavaa operaatiota.

Skenaario on hieman monimutkainen, joten en selitä kaikkea. Ajatuksena on, että eri säikeet käsittelevät saapuvia tilauksia. Kun tilauksen käsittely on päättynyt, tarkistetaan tilauksen tila.

Jokainen tilausten käsittelijä on eristetty omaan säikeeseen, joten voit optimoida, miten tallennat tiedot, ja sinulla on suora pääsy muistiin käyttämättä lukitusta.

Maksutilausten käsittelijä on ainoa säie, joka pääsee käsiksi käyttäjien saldoihin. Se voi hakea tai päivittää minkä tahansa saldon ilman huolta samanaikaisuusongelmista.

Putkisto käsittelee operaatioiden sarjan mahdollisimman nopeasti.

Johtopäätös

Putkistosuunnittelumallilla on paljon hyvin erilaisia toteutustapoja yksinkertaisesta komentoketjusta monimutkaisempaan työnkulkuun.

Montaa ominaisuutta voidaan tarvita, kuten katkaisijaa, asynkronista tai puskuria.

Myös useimmiten putkistoja halutaan käyttää silloin, kun halutaan liitännäistoiminnot, jotka pystyvät koukuttamaan putkilinjan suoritusvirtaukseen.

Vastaa

Sähköpostiosoitettasi ei julkaista.