Bölme perdesi düzeniBulkhead pattern

Uygulamanın öğelerini havuzlarda yalıtın; biri başarısız olursa, diğerleri çalışmaya devam edecektir.Isolate elements of an application into pools so that if one fails, the others will continue to function.

Bu düzen bir geminin gövde kısmındaki ayrılmış bölümlere benzediğinden Bölme Perdesi olarak adlandırılmıştır.This pattern is named Bulkhead because it resembles the sectioned partitions of a ship's hull. Bir geminin gövde kısmı hasar görürse yalnızca hasarlı bölüm suyla dolar, bu da geminin batmasını önler.If the hull of a ship is compromised, only the damaged section fills with water, which prevents the ship from sinking.

Bağlam ve sorunContext and problem

Bulut tabanlı bir uygulama birden fazla hizmet içerebilir ve bu hizmetlerden her birinin bir veya daha fazla tüketicisi bulunur.A cloud-based application may include multiple services, with each service having one or more consumers. Bir hizmette aşırı yük veya hata bulunması, hizmetin tüm tüketicilerini etkiler.Excessive load or failure in a service will impact all consumers of the service.

Ayrıca bir tüketici her istek için kaynakları kullanarak aynı anda birden fazla hizmete istek gönderebilir.Moreover, a consumer may send requests to multiple services simultaneously, using resources for each request. Tüketici, yanlış yapılandırılmış veya yanıt vermeyen bir hizmete istek gönderdiğinde istemcinin isteği tarafından kullanılan kaynaklar zamanında serbest bırakılamayabilir.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. Hizmete yönelik istekler devam ettikçe bu kaynaklar tükenebilir.As requests to the service continue, those resources may be exhausted. Örneğin, istemcinin bağlantı havuzu tükenmiş olabilir.For example, the client's connection pool may be exhausted. Bu noktada, tüketicinin diğer hizmetlere yönelik istekleri etkilenir.At that point, requests by the consumer to other services are impacted. Sonunda tüketici, yalnızca başlangıçtaki yanıt vermeyen hizmete değil, diğer hizmetlere de istek gönderemez.Eventually the consumer can no longer send requests to other services, not just the original unresponsive service.

Aynı kaynak tükenmesi sorunu birden çok tüketicinin bulunduğu hizmetleri de etkiler.The same issue of resource exhaustion affects services with multiple consumers. Bir istemciden gelen çok sayıda istek, hizmetteki kullanılabilir kaynakları tüketebilir.A large number of requests originating from one client may exhaust available resources in the service. Diğer tüketiciler artık hizmeti kullanamaz, bu da zincirleme bir hata etkisi yaratır.Other consumers are no longer able to consume the service, causing a cascading failure effect.

ÇözümSolution

Bölüm hizmeti tüketici yüküne ve kullanılabilirlik gereksinimlerine bağlı olarak farklı gruplar halinde örneklenir.Partition service instances into different groups, based on consumer load and availability requirements. Bu tasarım, hataların ayrılabilmesine yardımcı olur ve bazı tüketiciler için hata sırasında bile hizmet işlevselliğini sürdürmenize olanak sağlar.This design helps to isolate failures, and allows you to sustain service functionality for some consumers, even during a failure.

Bir hizmetin çağrılması için kullanılan kaynakların başka bir hizmetin çağrılması için kullanılan kaynakları etkilememesini sağlamak için tüketiciler de kaynakları bölümleyebilir.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. Örneğin, birden çok hizmeti çağıran bir tüketiciye her hizmet için bir bağlantı havuzu atanabilir.For example, a consumer that calls multiple services may be assigned a connection pool for each service. Bir hizmet başarısız olmaya başlarsa bu, yalnızca söz konusu hizmet için atanan bağlantı havuzunu etkiler; böylece tüketici diğer hizmetleri kullanmaya devam edebilir.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.

Bu düzenin avantajları şunlardır:The benefits of this pattern include:

  • Tüketicileri ve hizmetleri zincirleme hatalara karşı ayırır.Isolates consumers and services from cascading failures. Bir tüketiciyi ya da hizmeti etkileyen bir sorun kendi bölme perdesi içinde ayrılabilir, bu da çözümün tamamının başarısız olmasını önler.An issue affecting a consumer or service can be isolated within its own bulkhead, preventing the entire solution from failing.
  • Bir hizmet hatası durumunda bazı işlevleri korumanıza olanak tanır.Allows you to preserve some functionality in the event of a service failure. Uygulamanın diğer hizmetleri ve özellikleri çalışmaya devam eder.Other services and features of the application will continue to work.
  • Uygulamaların kullanımına yönelik farklı bir hizmet kalitesi sunan hizmetler dağıtmanızı sağlar.Allows you to deploy services that offer a different quality of service for consuming applications. Yüksek öncelikli bir tüketici havuzu, yüksek öncelikli hizmetleri kullanacak şekilde yapılandırılabilir.A high-priority consumer pool can be configured to use high-priority services.

Aşağıdaki diyagramda, hizmetleri tek tek çağıran bağlantı havuzları temelinde yapılandırılmış bölme perdeleri gösterilmektedir.The following diagram shows bulkheads structured around connection pools that call individual services. A Hizmeti başarısız olursa veya başka bir soruna neden olursa bağlantı havuzu ayrılır, böylece yalnızca A Hizmetine atanmış iş parçacığı havuzlarını kullanan iş yükleri etkilenir.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. B ve C Hizmetini kullanan iş yükleri etkilenmez ve kesinti olmadan çalışmaya devam eder.Workloads that use Service B and C are not affected and can continue working without interruption.

Bölme perdesi düzeni ilk diyagramı

Bir sonraki diyagramda tek bir hizmeti çağıran birden çok istemci gösterilmektedir.The next diagram shows multiple clients calling a single service. Her istemciye ayrı bir hizmet örneği atanır.Each client is assigned a separate service instance. 1. İstemci çok fazla istekte bulunmuş ve kendi örneğini sonuna kadar doldurmuştur.Client 1 has made too many requests and overwhelmed its instance. Her bir hizmet örneği diğerlerinden ayrılmış olduğu için diğer istemciler çağrı yapmaya devam edebilir.Because each service instance is isolated from the others, the other clients can continue making calls.

Bölme perdesi düzeni ilk diyagramı

Sorunlar ve dikkat edilmesi gerekenlerIssues and considerations

  • Uygulamanın kurumsal ve teknik gereksinimleri çerçevesinde bölümler tanımlayın.Define partitions around the business and technical requirements of the application.
  • Hizmetleri veya tüketicileri bölme perdelerine ayırırken maliyet, performans ve yönetilebilirlik açısından yükün yanı sıra teknoloji tarafından sunulan ayırma düzeyini de göz önünde bulundurun.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.
  • Daha gelişmiş bir hata işleme düzeyi sağlamak için yeniden deneme, devre kesici ve azaltma düzenleriyle bölme perdelerini birleştirmeyi deneyin.Consider combining bulkheads with retry, circuit breaker, and throttling patterns to provide more sophisticated fault handling.
  • Tüketicileri bölme perdelerine ayırırken işlemleri, iş parçacığı havuzlarını ve semaforları kullanmayı deneyin.When partitioning consumers into bulkheads, consider using processes, thread pools, and semaphores. Netflix Hystrix ve Polly gibi projeler tüketici bölme perdeleri oluşturmaya yönelik bir çerçeve sunar.Projects like Netflix Hystrix and Polly offer a framework for creating consumer bulkheads.
  • Hizmetleri bölme perdelerine ayırırken ayrı sanal makinelere, kapsayıcılara veya işlemlere dağıtmayı deneyin.When partitioning services into bulkheads, consider deploying them into separate virtual machines, containers, or processes. Kapsayıcılar son derece düşük yüklerle kaynak ayırma konusunda iyi bir denge sağlar.Containers offer a good balance of resource isolation with fairly low overhead.
  • Zaman uyumsuz iletileri kullanarak iletişim kuran hizmetler farklı sıra kümeleri aracılığıyla ayrılabilir.Services that communicate using asynchronous messages can be isolated through different sets of queues. Her sıra, söz konusu sıra üzerinde iletileri işleyen ayrılmış bir örnek kümesine veya sıradan çıkarmaya ve dağıtım işlemeye yönelik bir algoritma kullanan tek bir örnek grubuna sahip olabilir.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.
  • Bölme perdeleri için taneciklik düzeyini belirleyin.Determine the level of granularity for the bulkheads. Örneğin, kiracıları bölümlere dağıtmak istiyorsanız, her kiracıya ayrı bir bölüme yerleştirin veya bir bölüme birden çok kiracıyı yerleştirin.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.
  • Her bölümün performansını ve SLA’sını izleyin.Monitor each partition’s performance and SLA.

Bu düzenin kullanılacağı durumlarWhen to use this pattern

Bu düzeni kullanarak:Use this pattern to:

  • Özellikle hizmetlerden biri yanıt vermediğinde bile uygulama belirli bir düzeyde işlev sağlayabiliyorsa sağlayabilen bir arka uç hizmetleri kümesinin kullanımında yararlanılan kaynakları ayırın.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.
  • Kritik önem taşıyan tüketicileri standart tüketicilerden ayırın.Isolate critical consumers from standard consumers.
  • Uygulamayı zincirleme hatalardan koruyun.Protect the application from cascading failures.

Bu düzen aşağıdaki durumlarda uygun olmayabilir:This pattern may not be suitable when:

  • Kaynakların daha verimsiz bir şekilde kullanılması projede kabul edilebilir olmayabilir.Less efficient use of resources may not be acceptable in the project.
  • Eklenen karmaşıklık gerekli değildirThe added complexity is not necessary

ÖrnekExample

Aşağıdaki Kubernetes yapılandırma dosyası kendi CPU ve bellek kaynakları ile sınırlarını kullanarak tek bir hizmeti çalıştırmak için ayrılmış bir kapsayıcı oluşturur.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"