Válaszfal mintaBulkhead pattern

A válaszfal minta az alkalmazás olyan típusa, amely nem hibatűrő.The Bulkhead pattern is a type of application design that is tolerant of failure. Egy válaszfal architektúrában az alkalmazások elemei el vannak különítve a készletekben, így ha az egyik meghibásodik, a többiek továbbra is működni fognak.In a bulkhead architecture, elements of an application are isolated into pools so that if one fails, the others will continue to function. Ez a hajó hajótestének szakaszos partíciói (válaszfalai) után lett elnevezve.It's named after the sectioned partitions (bulkheads) of a ship's hull. Ha a hajótest megsérül, csak a sérült szakasz telik meg vízzel, így a hajó nem süllyed el.If the hull of a ship is compromised, only the damaged section fills with water, which prevents the ship from sinking.

Kontextus és problémaContext and problem

Egy felhőalapú alkalmazás több szolgáltatást is tartalmazhat, és minden szolgáltatás egy vagy több fogyasztóval is rendelkezhet.A cloud-based application may include multiple services, with each service having one or more consumers. Ha egy szolgáltatás túl van terhelve vagy meghibásodik, az minden fogyasztót érint.Excessive load or failure in a service will impact all consumers of the service.

Továbbá egy fogyasztó egyszerre több szolgáltatáshoz is küldhet kéréseket, és minden kéréshez erőforrásokat használ fel.Moreover, a consumer may send requests to multiple services simultaneously, using resources for each request. Ha egy fogyasztó kérést küld egy rosszul konfigurált vagy nem válaszoló szolgáltatásnak, előfordulhat, hogy az ügyfél kérése által felhasznált erőforrások hogy nem szabadulnak fel megfelelő időn belül.When the consumer sends a request to a service that is misconfigured or not responding, the resources used by the client's request may not be freed in a timely manner. Ahogy újabb kérések érkeznek a szolgáltatáshoz, ezek az erőforrások kimerülhetnek.As requests to the service continue, those resources may be exhausted. Kimerülhet például az ügyfél kapcsolatkészlete.For example, the client's connection pool may be exhausted. Ezen a ponton a fogyasztó által más szolgáltatásoknak küldött kérések is érintettek.At that point, requests by the consumer to other services are affected. Végül a fogyasztó már más szolgáltatásoknak sem fog tudni kéréseket küldeni, nem csak az eredeti nem válaszoló szolgáltatásnak.Eventually the consumer can no longer send requests to other services, not just the original unresponsive service.

Ugyanez az erőforrásfogyás a több fogyasztóval rendelkező szolgáltatásokat is érinti.The same issue of resource exhaustion affects services with multiple consumers. Az egy ügyféltől nagy számban érkező kérések kimeríthetik a szolgáltatás elérhető erőforrásait.A large number of requests originating from one client may exhaust available resources in the service. Így a többi fogyasztó tudja igénybe venni a szolgáltatást, ez pedig lépcsőzetesen terjedő hibákhoz vezet.Other consumers are no longer able to consume the service, causing a cascading failure effect.

MegoldásSolution

Particionálja a szolgáltatáspéldányokat különböző csoportokba a fogyasztók mennyisége és a rendelkezésre állási követelmények alapján.Partition service instances into different groups, based on consumer load and availability requirements. Ez a tervezés segít a hibák elkülönítésében, és meghibásodás esetén is biztosítja, hogy a szolgáltatás bizonyos fogyasztók számára elérhető legyen.This design helps to isolate failures, and allows you to sustain service functionality for some consumers, even during a failure.

A fogyasztók szintén particionálhatják az erőforrásokat, így az egyik szolgáltatás hívásához használt erőforrások nem befolyásolják a másik szolgáltatás hívásához használtakat.A consumer can also partition resources, to ensure that resources used to call one service don't affect the resources used to call another service. Például egy több szolgáltatást is hívó fogyasztóhoz szolgáltatásonként külön kapcsolatkészlet rendelhető hozzá.For example, a consumer that calls multiple services may be assigned a connection pool for each service. Ha egy szolgáltatás kezd meghibásodni, ez csak az adott szolgáltatáshoz hozzárendelt kapcsolatkészletet érinti, így a fogyasztó tovább használhatja a többi szolgáltatást.If a service begins to fail, it only affects the connection pool assigned for that service, allowing the consumer to continue using the other services.

A minta használata többek között a következő előnyökkel jár:The benefits of this pattern include:

  • Elkülöníti a fogyasztókat és szolgáltatásokat a lépcsőzetesen terjedő hibáktól.Isolates consumers and services from cascading failures. A fogyasztókat vagy szolgáltatásokat érintő hibák elkülöníthetők a saját válaszfalukon belül, így megakadályozható a teljes megoldás meghibásodása.An issue affecting a consumer or service can be isolated within its own bulkhead, preventing the entire solution from failing.
  • Lehetővé teszi a működésképesség bizonyos szintű fenntartását a szolgáltatás meghibásodása esetén is.Allows you to preserve some functionality in the event of a service failure. Az alkalmazás többi szolgáltatása és funkciója továbbra is működhet.Other services and features of the application will continue to work.
  • Lehetővé teszi olyan szolgáltatások üzembe helyezését, amelyek eltérő minőségű szolgáltatást biztosítanak a felhasználó alkalmazások számára.Allows you to deploy services that offer a different quality of service for consuming applications. Beállítható egy magas prioritású fogyasztókészlet a magas prioritású szolgáltatások használatához.A high-priority consumer pool can be configured to use high-priority services.

Az alábbi ábra a különálló szolgáltatásokat hívó kapcsolatkészletek köré strukturált válaszfalakat ábrázol.The following diagram shows bulkheads structured around connection pools that call individual services. Ha az A szolgáltatás meghibásodik vagy egyéb hibát okoz, a kapcsolatkészlet elkülönítése miatt a hiba csak azokat a számítási feladatokat érinti, amelyek az A szolgáltatáshoz hozzárendelt szálkészletet használják.If Service A fails or causes some other issue, the connection pool is isolated, so only workloads using the thread pool assigned to Service A are affected. A B és C szolgáltatásokat használó számítási feladatokat ez nem befolyásolja, és megszakítás nélkül működhetnek tovább.Workloads that use Service B and C are not affected and can continue working without interruption.

A válaszfal minta első ábrája

A következő diagram több ügyfelet ábrázol, amelyek ugyanazt a szolgáltatást hívják.The next diagram shows multiple clients calling a single service. Minden ügyfélhez különálló szolgáltatáspéldány van hozzárendelve.Each client is assigned a separate service instance. Az 1. ügyfél túl sok kérést küldött, és túlterhelte a példányát.Client 1 has made too many requests and overwhelmed its instance. Mivel minden szolgáltatáspéldány külön van választva a többitől, a többi ügyfél továbbra is küldhet hívásokat.Because each service instance is isolated from the others, the other clients can continue making calls.

Diagram, amely egyetlen szolgáltatást hívó több ügyfelet mutat be.

Problémák és megfontolandó szempontokIssues and considerations

  • Határozza meg a partíciókat az alkalmazás üzleti és műszaki követelményei alapján.Define partitions around the business and technical requirements of the application.
  • Amikor válaszfalakkal particionálja a szolgáltatásokat vagy fogyasztókat, vegye figyelembe a technológia által nyújtott elkülönítési szinteket és a terhelést (költségek, teljesítmény és kezelhetőség) is.When partitioning services or consumers into bulkheads, consider the level of isolation offered by the technology as well as the overhead in terms of cost, performance and manageability.
  • Vegye fontolóra a válaszfalak újrapróbálkozási, áramkör-megszakító és szabályozási mintákkal történő kombinálását a kifinomultabb hibakezelés biztosítása érdekében.Consider combining bulkheads with retry, circuit breaker, and throttling patterns to provide more sophisticated fault handling.
  • A fogyasztók válaszfalakkal történő particionálása esetén érdemes megfontolni a folyamatok, szálkészletek és szemaforok használatát.When partitioning consumers into bulkheads, consider using processes, thread pools, and semaphores. Az olyan projektek, mint a resilience4j és a Polly , keretet biztosítanak a fogyasztói válaszfalak létrehozásához.Projects like resilience4j and Polly offer a framework for creating consumer bulkheads.
  • A szolgáltatások válaszfalakkal történő particionálása esetén érdemes megfontolni a különálló virtuális gépeken, tárolókban vagy folyamatokban történő üzembe helyezést.When partitioning services into bulkheads, consider deploying them into separate virtual machines, containers, or processes. A tárolók viszonylag csekély többletterhelés mellett biztosítják az erőforrások elkülönítését.Containers offer a good balance of resource isolation with fairly low overhead.
  • Az aszinkron üzenetekkel kommunikáló szolgáltatások különböző üzenetsor-készletekkel különíthetők el.Services that communicate using asynchronous messages can be isolated through different sets of queues. Minden üzenetsor rendelkezhet egy dedikált példánykészlettel, amely feldolgozza az üzenetsorban található üzeneteket, vagy egyetlen példánycsoporttal, amely egy algoritmussal eltávolítja az üzeneteket a sorból, és kiosztja őket feldolgozásra.Each queue can have a dedicated set of instances processing messages on the queue, or a single group of instances using an algorithm to dequeue and dispatch processing.
  • Határozza meg a választófalak részletességi szintjét.Determine the level of granularity for the bulkheads. Ha például bérlőket szeretne terjeszteni a partíciók között, az egyes bérlőket külön partícióba helyezheti, vagy több bérlőt is helyezhet egy partícióba.For example, if you want to distribute tenants across partitions, you could place each tenant into a separate partition, or put several tenants into one partition.
  • Monitorozza az egyes partíciók teljesítményét és SLA-ját.Monitor each partition’s performance and SLA.

Mikor érdemes ezt a mintát használni?When to use this pattern

Ez a minta a következőkre használható:Use this pattern to:

  • háttérszolgáltatások készletét fogyasztó erőforrások elkülönítése, különösen, ha az alkalmazás akkor is működőképes marad valamilyen szinten, ha az egyik szolgáltatás nem válaszol;Isolate resources used to consume a set of backend services, especially if the application can provide some level of functionality even when one of the services is not responding.
  • kritikus fontosságú fogyasztók különválasztása a standard fogyasztóktól;Isolate critical consumers from standard consumers.
  • az alkalmazás védelme a lépcsőzetesen terjedő hibákkal szemben.Protect the application from cascading failures.

Nem érdemes ezt a mintát használni, ha:This pattern may not be suitable when:

  • az erőforrások kevésbé hatékony felhasználása nem elfogadható a projektben;Less efficient use of resources may not be acceptable in the project.
  • a hozzáadott összetettség nem szükséges.The added complexity is not necessary

PéldaExample

Az alábbi Kubernetes konfigurációs fájl egy egyetlen szolgáltatást futtató elkülönített tárolót hoz létre, amely saját processzor- és memória-erőforrásokkal, valamint korlátokkal rendelkezik.The following Kubernetes configuration file creates an isolated container to run a single service, with its own CPU and memory resources and limits.

apiVersion: v1
kind: Pod
metadata:
  name: drone-management
spec:
  containers:
  - name: drone-management-container
    image: drone-service
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "1"