[Software Architecture] The Pipeline Design Pattern – From Zero to Hero

In dit artikel gaan we in op de verschillende manieren om het pipeline-ontwerppatroon te implementeren, beginnend bij de basis tot meer complexe oplossingen.

The Pipeline Pattern

Het pipeline-patroon is een software-ontwerppatroon dat de mogelijkheid biedt om een opeenvolging van bewerkingen te bouwen en uit te voeren.

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

Dit patroon kan beter worden gebruikt in combinatie met het plugin-patroon, om de pijplijn dynamisch op te bouwen bij het starten van de applicatie.

Sequence

De meest eenvoudige implementatie van een pijplijn zou een eenvoudige opeenvolging van bewerkingen zijn.

De interface van een bewerking kan worden aangeroepen om gegevens te verwerken.

De pijplijn verwerkt elke bewerking één voor één. De pijplijnklasse implementeert ook de IOperation-interface, zodat ze kunnen worden gecombineerd.

De operatie kan worden geschreven in een speciale klasse.

Of gebruik een wrapper om automatisch een operatie te maken vanuit een lambda.

De pijplijnoperaties moeten worden geregistreerd voordat de pijplijn wordt aangeroepen.

Circuit Breaker

De eerste functie die u aan uw pijplijn wilt toevoegen is het toevoegen van een circuit breaker.

Elke operatie retourneert het resultaat : fail of succes.

Als een bewerking mislukt, moet de uitvoering van de pijplijn stoppen.

Asynchroon

Een andere vereiste kan zijn om een pijplijn te hebben die met asynchrone bewerkingen kan omgaan.

Elke bewerking moet nu de volgende bewerking in de pijplijn aanroepen, nadat ze klaar zijn met het verwerken van de gegevens.

De pijplijn is iets complexer, omdat deze de volgende bewerking moet instellen wanneer een nieuwe bewerking wordt geregistreerd. Een andere oplossing is het gebruik van een builder.

Deze bewerking is asynchroon en wordt in een speciale thread uitgevoerd, wanneer de tijd om is, wordt de volgende bewerking aangeroepen om de pijplijn voort te zetten.

De generieke bewerking kan zowel met een eenvoudige actie worden gebruikt, als met een ingebouwde stroomonderbreker als je een functie gebruikt.

Dit eenvoudige voorbeeld maakt gebruik van verschillende van de functies die we hebben geïmplementeerd.

Nu weet u hoe u uw pijplijn asynchroon kunt maken !

Het zou nog beter zijn als je nog een callback naar de vorige bewerking zou hebben, zodat je het resultaat tegen de stroom in door de pijplijn kunt laten gaan.

Plugin

De belangrijkste reden om het pijplijn-ontwerppatroon te gebruiken is vaak de behoefte om plugins te kunnen toevoegen die ofwel bewerkingen aan een bestaande pijplijn toevoegen ofwel een bewerking in het midden ervan kunnen haken.

De pijplijn is echt basaal, maar deze keer worden de bewerkingen blootgelegd.

Laten we een eenvoudige applicatie nemen met een pijplijn die alleen de 3 stappen in de console weergeeft. Deze toepassing ondersteunt ook plug-ins om de pijplijn te wijzigen.

De eerste plugin haakt een andere bewerking in het tweede slot van de pijplijn.

De tweede plugin voegt een nieuwe bewerking toe aan het einde van de pijplijn.

De applicatie en de plugins zijn samengevoegd, we kunnen de pijplijn aanroepen.

Batch

Een andere handige functie is om batchgegevens in dezelfde pijplijn te kunnen verwerken dan losse items.

De batchpijplijn wikkelt een pijplijn in en roept elke bewerking op elk item aan.

Elk item wordt gewikkeld, zodat we het resultaat van de stroomonderbreker kunnen onthouden.

Deze bewerking controleert of het gehele getal de vereiste orde van grootte heeft.

De pijplijn gaat de orde van grootte van een partij gehele getallen controleren.

De pijplijn roept alleen de volgende bewerking aan voor items die niet zijn mislukt.

High Performance Pipeline

Het Pipeline Design Pattern kan ook betrekking hebben op een veel specifiekere en prestatiegerichte softwarearchitectuur.

Sommige projecten gebruiken een pijplijn om de verwerking van een enorme hoeveelheid gegevens te optimaliseren door elke bewerking van de pijplijn in een speciale thread uit te voeren.

Elke thread consumeert en produceert gegevens uit een gelijktijdige wachtrij die als buffer fungeert.

Deze keer maken we gebruik van asynchrone bewerkingen met een circuit-breaker.

Als de bewerking slaagt, moet deze de volgende aanroepen, of afbreken als deze mislukt.

De pijplijn is ontworpen om de circuit-breker te omzeilen. Of de pijplijn nu slaagt of niet, hij zal altijd doorgaan met de bovenliggende pijplijnreeks en de volgende bewerking aanroepen.

Het scenario is nogal complex, dus ik zal niet alles uitleggen. Het idee is om verschillende threads te hebben voor het verwerken van inkomende orders. Wanneer een order is verwerkt, controleren we de status van de order.

Elke orderprocessor is geïsoleerd in een speciale thread, zodat u de manier waarop u de gegevens opslaat, kunt optimaliseren en directe toegang tot het geheugen hebt zonder gebruik te maken van een lock.

De betalingsorderprocessor is de enige thread die toegang heeft tot de gebruikerssaldi. Hij kan elk saldo opvragen of bijwerken zonder zich zorgen te maken over concurrency-kwesties.

De pijplijn verwerkt de opeenvolging van bewerkingen zo snel mogelijk.

Conclusie

Het Pipeline Design Pattern kan op heel veel verschillende manieren worden geïmplementeerd, van een eenvoudige Chain of Command tot een complexere Workflow.

Vele functies kunnen nodig zijn, zoals circuit-breaker, asynchroon of buffer, maar meestal wil je pipelines gebruiken als je plugins wilt hebben die kunnen inhaken op de pipeline execution flow.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.