[Softwarearkitektur] Pipeline-designmønsteret – fra nul til helt

I denne artikel vil vi undersøge de forskellige måder at implementere pipeline-designmønsteret på, lige fra det grundlæggende til mere komplekse løsninger.

Pipeline-mønsteret

Pipeline-mønsteret er et softwaredesignmønster, der giver mulighed for at opbygge og udføre en sekvens af operationer.

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

Dette mønster bruges bedre i forbindelse med plugin-mønsteret, for dynamisk at opbygge pipelinen, når applikationen starter.

Sequence

Den mest grundlæggende implementering af en pipeline vil være en simpel sekvens af operationer.

Grænsefladen for en operation kan påberåbes for at behandle data.

Pipelinen behandler hver operation en efter en. Pipelineklassen implementerer også IOperation-grænsefladen, så de kan kombineres.

Oprationen kan skrives i en dedikeret klasse.

Og du kan bruge en wrapper til automatisk at oprette en operation fra en lambda.

Pipelineoperationerne skal registreres, før pipelinen påkaldes.

Circuit Breaker

Den første funktion, du ønsker at tilføje til din pipeline, er at tilføje en circuit breaker.

Hver operation returnerer resultatet : fail eller succes.

Hvis en operation mislykkes, skal pipelineudførelsen stoppe.

Asynkron

Et andet krav kunne være at have en pipeline, der kan håndtere asynkrone operationer.

Alle operationer skal nu kalde den næste operation i pipelinen, efter at de er færdige med at behandle dataene.

Pipelinen er lidt mere kompleks, fordi den skal indstille den næste operation, når en ny operation registreres. En anden løsning er at bruge en builder.

Denne operation er asynkron og vil køre i en dedikeret tråd, når tiden er udløbet, vil den påkalde den næste operation for at fortsætte pipelinen.

Den generiske operation kan bruges både med en simpel handling eller bruge en indbygget kredsløbsafbryder, hvis du bruger en funktion.

Dette enkle eksempel bruger flere af de funktioner, vi har implementeret.

Nu ved du, hvordan du kan gøre din pipeline asynkron !

Det ville være endnu bedre, hvis havde en anden callback til den foregående operation, så du kunne få resultatet til at gå i modstrøm gennem pipelinen.

Plugin

Den vigtigste grund til at bruge pipeline-designmønsteret er ofte kravet om at kunne tilføje plugins, der enten vil tilføje operationer til en eksisterende pipeline eller hooke en operation midt i den.

Pipelinen er virkelig grundlæggende, men denne gang er operationerne eksponeret.

Lad os tage et simpelt program med en pipeline, der kun vil vise de 3 trin i konsollen. Denne applikation understøtter også plugins til at ændre pipelinen.

Det første plugin vil hægte en anden operation på det andet slot i pipelinen.

Det andet plugin vil tilføje en ny operation i slutningen af pipelinen.

Da programmet og plugins er sat sammen, kan vi påkalde pipelinen.

Batch

En anden nyttig funktion er at kunne behandle batchdata i den samme pipeline end enkeltelementer.

Batch-pipeline omslutter en pipeline og kalder hver operation på hvert element.

Hvert element er omsluttet, så vi kan huske resultatet af kredsløbsbryderen.

Denne operation kontrollerer, om det hele tal har den krævede størrelsesorden.

Pipelinen skal kontrollere størrelsesordenen for en batch af hele tal.

Pipelinen påkalder kun den næste operation for elementer, der ikke mislykkedes.

High Performance Pipeline

Pipeline-designmønstret kan også henvise til en meget mere specifik og præstationsorienteret softwarearkitektur.

Nogle projekter bruger en pipeline til at optimere behandlingen af en stor datamængde ved at køre hver operation i pipelinen i en dedikeret tråd.

Hver tråd vil forbruge og producere data fra en samtidig kø, der vil fungere som buffer.

Denne gang vil vi bruge asynkrone operationer med en kredsløbsafbryder.

Hvis operationen er vellykket, skal den påberåbe sig næste, eller afslutte, hvis den mislykkedes.

Pipelinen er designet til at omgå kredsløbsafbryderen. Succes eller Fail, vil den altid fortsætte den overordnede pipeline-sekvens og kalde den næste operation.

Scenariet er lidt komplekst, så jeg vil ikke forklare alt. Ideen er at have forskellige tråde til at behandle indgående ordrer. Når en ordre er færdigbehandlet, kontrollerer vi ordrens status.

Hver ordreprocessor er isoleret i en dedikeret tråd, så du kan optimere, hvordan du gemmer dataene og har direkte hukommelsesadgang uden brug af lås.

Betalingsordreprocessoren er den eneste tråd, der kan få adgang til brugerens saldi. Den kan hente eller opdatere enhver saldo uden at bekymre sig om samtidighedsproblemer.

Pipelinen behandler sekvensen af operationer så hurtigt som muligt.

Slutning

Pipeline-designmønstret har en masse meget forskellige måder at blive implementeret på, fra en simpel kommandokæde til et mere komplekst workflow.

Mange funktioner kan være nødvendige, såsom kredsløbsafbryder, asynkron eller buffer, men for det meste vil man bruge pipelines, når man vil have plugins, der kan hægte sig på pipelineudførelsesflowet.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.