회복성 패턴(서킷 브레이커, 재시도, 폴백)

 

마이크로서비스 아키텍처에서는 여러 서비스가 서로 협력하여 작업을 수행하므로, 한 서비스의 장애가 전체 시스템으로 전파될 수 있는 위험이 있습니다.

회복성 패턴은 이러한 문제를 완화하고 시스템의 안정성과 가용성을 높이기 위한 방법입니다. 대표적인 회복성 패턴으로는 서킷 브레이커, 재시도, 폴백이 있습니다.

 

서킷 브레이커(Circuit Breaker)

서킷 브레이커는 전기 회로에서 과부하를 방지하기 위해 사용되는 개념을 차용한 것으로, 마이크로서비스 간의 호출에 적용됩니다.

서킷 브레이커는 호출 실패 횟수를 추적하고, 일정 임계값을 넘으면 호출을 차단하여 장애가 전파되는 것을 방지합니다.

 

Netflix Hystrix

Hystrix는 Netflix에서 개발한 서킷 브레이커 라이브러리입니다. Hystrix는 호출 실패 횟수, 호출 지연 시간 등을 모니터링하고, 일정 조건을 만족하면 서킷을 열어 호출을 차단합니다.

1
2
3
4
5
6
7
8
@HystrixCommand(fallbackMethod = “getDefaultUser”)
public User getUserById(String id) {
    return userService.getUserById(id);
}
public User getDefaultUser(String id) {
    return new User(“Default”“User”);
}
cs

 

Resilience4j

Resilience4j는 Java 8 이상에서 사용할 수 있는 경량의 회복성 라이브러리입니다. Hystrix와 유사한 기능을 제공하면서도 더 간단하고 가벼운 것이 특징입니다.

1
2
3
4
5
6
7
8
CircuitBreaker circuitBreaker = CircuitBreaker.ofDefaults(“userService”);
Supplier<User> supplier = CircuitBreaker.decorateSupplier(circuitBreaker,
    () > userService.getUserById(id));
User user = Try.ofSupplier(supplier)
    .recover(throwable > new User(“Default”“User”))
   .get();
cs

 

재시도(Retry)

재시도 패턴은 호출 실패 시 일정 횟수만큼 호출을 반복하는 방법입니다. 일시적인 네트워크 문제나 서비스의 일시적인 장애로 인한 호출 실패를 방지할 수 있습니다.

1
2
3
4
@Retryable(value = RuntimeException.class, maxAttempts = 3, backoff = @Backoff(delay = 1000))
public User getUserById(String id) {
    return userService.getUserById(id);
}
cs

 

폴백(Fallback)

폴백은 호출 실패 시 대체 동작을 수행하는 패턴입니다. 주로 기본값을 반환하거나, 캐시된 데이터를 사용하는 등의 방법으로 구현됩니다.

1
2
3
4
5
6
7
8
@HystrixCommand(fallbackMethod = “getDefaultUser”)
public User getUserById(String id) {
    return userService.getUserById(id);
}
public User getDefaultUser(String id) {
    return new User(“Default”“User”);
}
cs

 

회복성 패턴을 적용하면 마이크로서비스 시스템의 안정성과 가용성을 높일 수 있습니다.

하지만 지나친 사용은 코드의 복잡성을 증가시키고 성능에 영향을 줄 수 있으므로, 적절한 수준에서 사용하는 것이 중요합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다