선박은 여러 개의 독립적인 구역으로 나눠져 있고, 한 구역에서 문제가 발생해도 다른 구역에는 영향을 끼치지 않는 설계를 가지고 있습니다. 이 Bulkhead는 선박 한쪽에 큰 구명이 뚫려도 손상을 최소화해 여전히 항해를 할 수 있게 해주죠.
여기서 영감을 받은 것이 'Bulkhead Pattern'입니다. Bulkhead Pattern은 소프트웨어 설계 패턴 중 하나로, 논리적으로 서로 다른 작업을 분리하고, 실패가 전체 시스템에 영향을 미치지 않도록 격리하는 것을 목표로 합니다. 마이크로서비스 아키텍처에서 서로 다른 서비스 간에 공유 자원에 대한 액세스를 제한하여 특정 서비스에서 발생한 문제가 전체 시스템에 영향을 미치는 것을 방지하는 역할을 하죠.
Bulkhead Pattern은 사실 Fault Tolerance Pattern의 한 종류입니다. 격리를 통해서 오류의 영향 범위 제한해 Fault Tolerance를 제공하지요. (참고로 Fault Tolerance Pattern에서는 Retry, Cicuit Breaker, Fallback을 통해서 Fault Tolerance를 제공하는 방법도 포함합니다)
사실 Bulkhead Pattern을 마냥 어렵게 생각하지 않으셔도 됩니다. 우리는 이미 잘 활용하고 있는 것이니까요.
데이터베이스 커넥션 풀링, ThreadPoolTaskExecutor도 Bulkhead Pattern의 한 형태로 볼 수 있습니다.
데이터베이스 커넥션 풀링은 데이터베이스와의 연결을 여러 개 생성하고 이들을 재사용하여, 많은 수의 클라이언트가 동시에 데이터베이스에 액세스할 수 있게 합니다. 이는 각 클라이언트에게 자체 커넥션을 제공하는 것으로, 이는 본질적으로 Bulkhead Pattern의 원칙인 격리와 함께 능동적인 실패 관리를 따릅니다.
각 클라이언트가 자신만의 데이터베이스 커넥션을 가지고 있기 때문에, 하나의 클라이언트에서 발생한 문제가 다른 클라이언트에게 영향을 미치지 않습니다. 또한, 클라이언트 수가 커넥션 풀의 크기를 초과하면, 추가적인 요청은 대기 상태가 될 수 있거나, 실패를 반환하여 빠르게 실패하게 됩니다. 이는 또한 Bulkhead Pattern의 핵심 원칙인 빠른 실패죠.
Hystrix를 이용한 Bulkhead Pattern 구현
Hystrix는 오류 허용 및 장애 복구 패턴 중 하나로, Thread Pool을 이용해 Bulkhead Pattern을 구현합니다. Hystrix Command는 동일한 작업 세트를 수행하는 작업들에게 별도의 Thread Pool을 할당합니다. 이 방법은 서로 다른 작업 간에 스레드를 공유하지 않아, 한 작업에서 발생한 문제가 다른 작업에 영향을 미치지 않도록 합니다.
Hystrix는 요청이 Thread Pool의 크기를 초과하면 해당 요청을 거부하며, 이는 클라이언트에게 빠르게 실패를 알리는 데 도움이 됩니다. 이를 통해, 다른 작업들이 해당 스레드 풀에서 지연되거나 실패하는 작업에 영향 받지 않도록 보장할 수 있습니다.
자바에서 Hystrix를 사용하여 Bulkhead Pattern을 구현하는 기본적인 코드 예시입니다.
public class MyCommand extends HystrixCommand<String> {
private final String name;
public MyCommand(String name) {
super(HystrixCommandGroupKey.Factory.asKey("MyGroup"));
this.name = name;
}
@Override
protected String run() {
// 여기서 네트워크 호출 또는 고비용 작업을 수행
return "Hello " + name;
}
}
위의 코드에서 "MyGroup"은 Hystrix Command Group에 해당하며, 동일한 그룹의 모든 Command는 동일한 Thread Pool을 사용합니다. 이렇게 Hystrix를 사용하여 Bulkhead Pattern을 구현하면, 시스템의 각 부분을 독립적으로 보호하고, 전체 시스템에 영향을 미칠 수 있는 잠재적인 문제를 격리하는데 도움이 됩니다.
오늘은 Bulkhead 패턴에 대해 알아보았습니다. 용어는 익숙하지 않더라도 개념은 이미 알고 계실텐데요. 알게 모르게 곳곳에서 사용되는 Bulkhead 패턴! 면접에서 써먹어 보시 바랍니다.
'엔지니어링' 카테고리의 다른 글
이벤트 주도 아키텍처(EDA)와 API: 어떤 걸 선택해야 할까? (0) | 2023.07.21 |
---|---|
Amazon API Gateway vs API Gateway 직접 구현 (0) | 2023.07.17 |
서비스 디스커버리 패턴 (0) | 2023.07.15 |
API 게이트웨이 - Rate limit (0) | 2023.07.15 |
Spring Boot를 이용한 OAuth 2.0 인증 구현 (0) | 2023.07.15 |