[Arhitectura software] Modelul de proiectare pipeline – de la zero la erou

În acest articol, vom explora diferitele modalități de implementare a modelului de proiectare pipeline pornind de la elementele de bază până la soluții mai complexe.

Patronul pipeline

Patronul pipeline este un model de proiectare software care oferă capacitatea de a construi și executa o secvență de operații.

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

Acest tipar este mai bine utilizat împreună cu tiparul plugin, pentru a construi în mod dinamic pipeline-ul la pornirea aplicației.

Secvență

Cea mai de bază implementare a unui pipeline ar fi o simplă secvență de operații.

Interfața unei operații poate fi invocată pentru a procesa datele.

Peline-ul procesează fiecare operație una câte una. Clasa pipeline-ului implementează, de asemenea, interfața IOperation, astfel încât acestea pot fi combinate.

Operația poate fi scrisă într-o clasă dedicată.

Sau se poate folosi un wrapper pentru a crea automat o operație dintr-un lambda.

Operațiile pipeline-ului trebuie înregistrate înainte ca pipeline-ul să fie invocat.

Circuit Breaker

Prima caracteristică pe care doriți să o adăugați la pipeline-ul dumneavoastră este să adăugați un circuit breaker.

Care operație va returna rezultatul : eșec sau succes.

Dacă o operație eșuează, execuția pipeline-ului ar trebui să se oprească.

Asincronă

O altă cerință ar putea fi aceea de a avea un pipeline care să poată face față operațiunilor asincrone.

Care operație va trebui acum să apeleze următoarea operație din pipeline, după ce au terminat de procesat datele.

Pipoductul este puțin mai complex, deoarece trebuie să seteze următoarea operație atunci când este înregistrată o nouă operație. O altă soluție este utilizarea unui constructor.

Această operație este asincronă și va rula într-un fir dedicat, când timpul este expirat, va invoca operația următoare pentru a continua pipeline-ul.

Operația generică poate fi utilizată atât cu o acțiune simplă, cât și cu un întrerupător încorporat dacă se utilizează o funcție.

Acest exemplu simplu folosește mai multe dintre caracteristicile pe care le-am implementat.

Acum știți cum să vă faceți pipeline-ul asincron !

Ar fi și mai bine dacă ați avea un alt callback la operația anterioară, astfel încât rezultatul să poată merge în sens invers prin pipeline.

Plugin

Motivul principal pentru a folosi modelul de proiectare a pipeline-ului este adesea cerința de a putea adăuga plugin-uri care fie vor adăuga operații la un pipeline existent, fie vor agăța o operație în mijlocul acestuia.

Pipoductul este într-adevăr de bază, dar de data aceasta, operațiile sunt expuse.

Să luăm o aplicație simplă cu un pipeline care va afișa doar cei 3 pași în consolă. Această aplicație suportă, de asemenea, plugin-uri pentru a modifica pipeline-ul.

Primul plugin va agăța o altă operație în al doilea slot al pipeline-ului.

Cel de-al doilea plugin va adăuga o nouă operație la sfârșitul pipeline-ului.

Aplicația și plugin-urile sunt puse împreună, putem invoca pipeline-ul.

Batch

O altă caracteristică utilă este aceea de a putea procesa date pe loturi în același pipeline decât elemente individuale.

Puterea batch înfășoară o conductă și apelează fiecare operație pe fiecare element.

Care element este înfășurat, astfel încât să ne putem aminti rezultatul întrerupătorului.

Această operație verifică dacă numărul întreg are ordinul de mărime necesar.

Pipoductul va verifica ordinul de mărime al unui lot de numere întregi.

Pipoductul invocă operația următoare numai pentru elementele care nu au eșuat.

High Performance Pipeline

The Pipeline Design Pattern se poate referi, de asemenea, la o arhitectură software mult mai specifică și orientată spre performanță.

Câteva proiecte folosesc o conductă pentru a optimiza procesarea unei cantități uriașe de date prin rularea fiecărei operații din conductă într-un fir dedicat.

Care fir va consuma și va produce date dintr-o coadă concurentă care va acționa ca un buffer.

De data aceasta, vom folosi operații asincrone cu un întrerupător de circuit.

Dacă operația are succes, ar trebui să invoce următoarea, sau să se încheie dacă a eșuat.

Pipoductul este proiectat să ocolească întrerupătorul de circuit. Succes sau eșec, va continua întotdeauna secvența pipeline-ului părinte și va apela operația următoare.

Scenariul este puțin complex, așa că nu voi explica totul. Ideea este de a avea diferite fire de execuție pentru a procesa comenzile primite. Când se termină procesarea unei comenzi, verificăm starea comenzii.

Care procesator de comenzi este izolat într-un fir dedicat, astfel încât să puteți optimiza modul în care stocați datele și să aveți acces direct la memorie fără a folosi blocare.

Procesorul de comenzi de plată este singurul fir care poate accesa soldurile utilizatorilor. Acesta poate obține sau actualiza orice sold fără să se preocupe de problemele de concurență.

Peline-ul procesează secvența de operații cât mai rapid posibil.

Concluzie

Patronul de proiectare pipeline are o mulțime de moduri foarte diferite de a fi implementat, de la un simplu lanț de comandă la un flux de lucru mai complex.

Multe caracteristici pot fi necesare, cum ar fi întrerupătorul de circuit, asincron sau tamponul, dar de cele mai multe ori, doriți să folosiți pipeline-uri atunci când doriți să aveți plugin-uri care se pot agăța în fluxul de execuție al pipeline-ului.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.