Bulkhead pattern

  • 03/19/2020
  • 4 minuten om te lezen
    • d
    • D
    • a
    • v
    • d
    • +6

Het Bulkhead-patroon is een type applicatieontwerp dat tolerant is voor falen. In een bulkhead-architectuur worden elementen van een applicatie geïsoleerd in pools, zodat als er een faalt, de andere blijven functioneren. Het is vernoemd naar de doorgesneden schotten (bulkheads) van de romp van een schip. Als de romp van een schip wordt gecompromitteerd, vult alleen het beschadigde deel zich met water, waardoor wordt voorkomen dat het schip zinkt.

Context en probleem

Een cloudgebaseerde toepassing kan meerdere services omvatten, waarbij elke service een of meer consumenten heeft. Overmatige belasting of uitval van een dienst heeft gevolgen voor alle consumenten van de dienst.

Bovendien kan een consument verzoeken naar meerdere diensten tegelijk sturen, waarbij voor elk verzoek middelen worden gebruikt. Wanneer de consument een verzoek stuurt naar een dienst die verkeerd is geconfigureerd of niet reageert, worden de middelen die door het verzoek van de klant worden gebruikt, mogelijk niet tijdig vrijgemaakt. Als de verzoeken aan de dienst doorgaan, kunnen die middelen uitgeput raken. De verbindingspool van de client kan bijvoorbeeld uitgeput zijn. Op dat moment worden de verzoeken van de consument aan andere diensten beïnvloed. Uiteindelijk kan de consument geen verzoeken meer sturen naar andere diensten, niet alleen naar de oorspronkelijke niet-reagerende dienst.

Hetzelfde probleem van uitputting van hulpbronnen treft diensten met meerdere consumenten. Een groot aantal verzoeken afkomstig van één client kan de beschikbare bronnen in de service uitputten. Andere gebruikers kunnen de dienst niet meer gebruiken, waardoor een cascade-effect optreedt.

Oplossing

Verdeling van service-instanties in verschillende groepen, op basis van de belasting van gebruikers en beschikbaarheidseisen. Dit ontwerp helpt storingen te isoleren en stelt u in staat de servicefunctionaliteit voor sommige consumenten in stand te houden, zelfs tijdens een storing.

Een consument kan ook resources partitioneren, om ervoor te zorgen dat resources die worden gebruikt om de ene service op te roepen, geen invloed hebben op de resources die worden gebruikt om een andere service op te roepen. Een consument die meerdere diensten oproept, kan bijvoorbeeld voor elke dienst een verbindingspool toegewezen krijgen. Als een service begint te falen, heeft dit alleen invloed op de verbindingspool die aan die service is toegewezen, waardoor de consument de andere services kan blijven gebruiken.

De voordelen van dit patroon zijn onder meer:

  • Verzekert consumenten en services van cascadefouten. Een probleem dat een consument of dienst treft, kan binnen zijn eigen schot worden geïsoleerd, waardoor wordt voorkomen dat de hele oplossing uitvalt.
  • Hiermee kunt u bepaalde functionaliteit behouden in het geval van een dienststoring. Andere services en functies van de toepassing blijven werken.
  • Hiermee kunt u services implementeren die een andere kwaliteit van service bieden voor consumerende toepassingen. Een consumentenpool met hoge prioriteit kan worden geconfigureerd om services met hoge prioriteit te gebruiken.

Het volgende diagram toont schotten die zijn gestructureerd rond verbindingspools die afzonderlijke services oproepen. Als service A faalt of een ander probleem veroorzaakt, wordt de verbindingspool geïsoleerd, zodat alleen werklasten die gebruikmaken van de threadpool die aan service A is toegewezen, worden beïnvloed. Werklasten die gebruikmaken van service B en C ondervinden geen gevolgen en kunnen zonder onderbreking doorwerken.

Het volgende diagram toont meerdere clients die een enkele service aanroepen. Elke client krijgt een afzonderlijke service-instantie toegewezen. Cliënt 1 heeft te veel verzoeken gedaan en heeft zijn instantie overbelast. Omdat elke service-instantie is geïsoleerd van de andere, kunnen de andere clients doorgaan met bellen.

Ontwerpen en overwegingen

  • Definieer partities rond de zakelijke en technische vereisten van de toepassing.
  • Overweeg bij het indelen van services of consumenten in schotten het door de technologie geboden isolatieniveau en de overhead in termen van kosten, prestaties en beheerbaarheid.
  • Overweeg het combineren van schotten met retry-, circuit breaker- en throttling-patronen om een geavanceerdere foutenafhandeling te bieden.
  • Overweeg bij het indelen van consumenten in schotten het gebruik van processen, thread pools en semaforen. Projecten zoals resilience4j en Polly bieden een raamwerk voor het creëren van consumer bulkheads.
  • Wanneer services in bulkheads worden gepartitioneerd, overweeg dan om ze in afzonderlijke virtuele machines, containers of processen te implementeren. Containers bieden een goede balans tussen resource-isolatie en vrij lage overhead.
  • Diensten die communiceren met behulp van asynchrone berichten kunnen worden geïsoleerd door middel van verschillende sets van wachtrijen. Elke wachtrij kan een specifieke set instanties hebben die berichten op de wachtrij verwerken, of een enkele groep instanties die een algoritme gebruiken om dequeue en dispatch verwerking.
  • Bepaal het niveau van granulariteit voor de schotten. Als u bijvoorbeeld huurders over partities wilt verdelen, kunt u elke huurder in een afzonderlijke partitie plaatsen, of verschillende huurders in één partitie plaatsen.
  • Monitor de prestaties en SLA van elke partitie.

Wanneer dit patroon te gebruiken

Gebruik dit patroon om:

  • Isolate resources gebruikt om een set van backend services te consumeren, vooral als de applicatie een bepaald niveau van functionaliteit kan bieden, zelfs wanneer een van de services niet reageert.
  • Scheid kritieke consumenten van standaard consumenten.
  • Bescherm de toepassing tegen cascadefouten.

Dit patroon is mogelijk niet geschikt wanneer:

  • Minder efficiënt gebruik van hulpbronnen kan niet acceptabel zijn in het project.
  • De toegevoegde complexiteit is niet nodig

Example

Het volgende Kubernetes-configuratiebestand maakt een geïsoleerde container om een enkele service te draaien, met zijn eigen CPU- en geheugenbronnen en limieten.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.