답변:
일반적으로 벌크 헤드 패턴의 목표는 시스템의 한 부분에서 오류를 방지하여 전체 시스템을 중단하는 것입니다. 이 용어는 선박 전체가 범람하는 단일 선체 파손을 피하기 위해 선박이 별도의 수밀 구획으로 분할 된 선박에서 유래합니다. 하나의 격벽 만 침수됩니다.
벌크 헤드 패턴의 구현은 시스템을 보호하려는 오류의 종류에 따라 다양한 형태를 취할 수 있습니다. 이 답변에서 Hystrix가 처리하는 오류 유형에 대해서만 설명합니다.
격벽 패턴이 책 Release It! 작성자 : Michael T. Nygard.
Hystrix의 벌크 헤드 구현 은 구성 요소에 대한 동시 호출 수를 제한합니다 . 이렇게하면 구성 요소의 응답을 기다리는 리소스 (일반적으로 스레드)의 수가 제한됩니다.
세 가지 다른 구성 요소 A , B 및 C 를 사용하는 요청 기반 다중 스레드 응용 프로그램 (예 : 일반적인 웹 응용 프로그램)이 있다고 가정합니다 . 구성 요소 C에 대한 요청이 중단되기 시작하면 결국 모든 요청 처리 스레드가 C 의 응답을 기다리는 동안 중단됩니다 . 이로 인해 응용 프로그램이 완전히 응답하지 않습니다. C에 대한 요청 이 느리게 처리되는 경우 부하가 충분히 높으면 비슷한 문제가 발생합니다.
Hystrix의 벌크 헤드 패턴 구현은 구성 요소에 대한 동시 호출 수를 제한하며이 경우 애플리케이션을 저장했을 것입니다. 요청 처리 스레드가 30 개이고 C에 대한 동시 호출이 10 개로 제한되어 있다고 가정합니다 . 그러면 C를 호출 할 때 최대 10 개의 요청 처리 스레드가 중단 될 수 있고 다른 20 개의 스레드는 여전히 요청을 처리하고 구성 요소 A 와 B를 사용할 수 있습니다 .
Hystrix는 벌크 헤드에 대해 스레드 격리와 세마포어 격리라는 두 가지 접근 방식을 가지고 있습니다.
표준 접근 방식은 구성 요소 C 에 대한 모든 요청을 고정 된 수의 스레드가 있고 요청 대기열이없는 (또는 작은) 별도의 스레드 풀로 전달하는 것입니다.
다른 방법은 C에 대한 요청 전에 모든 호출자가 허용 (시간 초과 0)을 얻도록하는 것 입니다. 세마포어에서 허가를 얻을 수없는 경우 C를 호출합니다. 이 통과되지 않습니다.
스레드 풀 방식의 장점은 C 로 전달되는 요청이 시간 초과 될 수 있다는 것입니다. 이는 세마포어를 사용할 때 불가능한 일입니다.
다음은 Netflix Hystrix에서 영감을 얻은 Resilience4j의 벌크 헤드에 대한 런타임 설명 이 포함 된 좋은 예입니다 .
아래 예제 구성은 사용의 명확성을 제공 할 수 있습니다.
구성 예 : 주어진 시간에 최대 5 개의 동시 통화를 허용합니다. 진행중인 5 개 중 하나가 동시에 완료 될 때까지 또는 최대 2 초까지 다른 통화를 기다리십시오.
아이디어는 소비 할 수있는 것보다 더 많은 부하로 시스템에 부담을주지 않는 것입니다. 들어오는 부하가 소비량보다 크면 적절한 시간 동안 기다리거나 시간 초과를 기다렸다가 대체 경로로 이동하십시오.