Skip to content

Latest commit

 

History

History
66 lines (38 loc) · 4.54 KB

recover.md

File metadata and controls

66 lines (38 loc) · 4.54 KB

마이크로서비스 클라이언트 회복성 패턴

모든 시스템, 특히 분산 환경의 시스템은 장애가 발생하기 쉽다.

그리고 그러한 장애를 대처하고, 방지하는 작업은 개발자의 가장 큰 숙제중 하나다.

그러나 대게 이러한 장애 감지는 인프라 스트럭쳐 시스템 문제나, 한 서비스의 완전한 장애를 전재로 두고 있다.

이러한 전재는 사소한 서비스의 장애를 해결하는 것에만 도움이 되지만, 회복력 있는 시스템을 구축하기 위해서는 서비스 하나가 충돌하면 이를 감지하고 그 서비스를 우회할 수 있어야 한다.

그러나 성능 저하를 감지하고 우회하는 것은 다음과 같은 이유로 어렵다.

  1. 서비스 저하는 간헐적으로 발생하고 확장된다.
  2. 원격 서비스 호출은 대게 동기적으로 호출되며 오래걸리는 호출을 중단하지 않는다.
  3. 애플리케이션은 대개 부분적인 저하가 아닌 원격 자원의 완전한 장애를 처리하도록 설계된다.

원격 서비스로 야기되는 문제는 한 서비스가 다운되면 다른 서비스들도 함께 다운될 수 있다는 문제가 있다. 그렇기에 안전 장치가 존재하지 않는다면 제대로 동작하지 않는 서비스 하나가 여러 애플리케이션을 짧은 시간동안 다운시킬 수도 있다.


클라이언트 회복성 패턴

클라이언트의 회복성을 위한 소프트웨어 패턴을 원격 서비스가 에러를 던지거나 제대로 동작하지 못해 원격 자원의 접근이 실패할 때, 원격 자원을 호출하는 클라이언트 충돌을 막는데 초점이 맞추어져 있다.

이 패턴의 목적은 DB 커넥션 및 쓰레드 풀 같은 소중한 클라이언트의 소비자에게 '상향 전파' 되는 것을 막는 것이다.

클라이언트 회복성 패턴은 4가지가 있는데 다음과 같다.

  1. 클라이언트측 부하 분산
  2. 회로 차단기 (Circuit Breaker)
  3. 폴백 (fallback)
  4. 벌크 헤드 (bulkhead)

클라이언트측 부하 분산

클라이언트측 부하 분산은 즉 넷플릭스 유레카와 같은 서비스 디스커버리 에이전트를 통해 각각의 서비스들의 위치를 캐싱한다. 그리고 클라이언트의 요청이 들어오면 서비스 위치 풀에서 관리하는 서비스의 위치를 하나씩 전달한다.

클라이언트측 로드 밸런서는 소비자와 클라이언트 서비스 사이에 위치하여 서비스의 상태를 파악한다. 불량 작동한 서비스는 클라이언트 로드 밸런서가 상태를 파악할 수 있다면 가용 서비스 위치 풀에서 해당 서비스를 제외시킨다.

회로 차단기 (Circuit Breaker)

회로 차단기는 요청을 모니터링하며, 호출이 오래 걸린다면 회로차단기가 해당되는 서비스의 호출을 중단한다.

회로 차단기는 원격 자원을 상시 모니터링하며 지정된 만큼 실패수가 쌓이게 되면 고장난 서비스로 간주하여 빠르게 실패 시키고 고장난 자원에게 요청을 보내지 않도록 한다.

폴백 (fallback)

폴백 패턴은 원격 서비스에 대한 호출이 실패하게되면 그 대처하는 방법의 동작을 수행하는 것이다.

보통 대체 코드 경로를 실행해 응답을 돌려준다거나 (stub) 데이터 소스에서 데이터를 찾거나 향후 처리를 위해 요청을 큐에 입력하는 작업 등으로 사용된다.

사용자 호출 문제로 예외를 발생시키지는 않으며, 나중에 해당 요청을 수행할 수 있다고 표시된다.

벌크 헤드

벌크 헤드 패턴을 적용하면 원격 자원에 대한 호출을 자원별 쓰레드 풀로 분리하므로 특정 원격 자원의 호출이 느려져 전체 애플리케이션이 다운 될 수 있는 위험을 줄일 수 있다.


원격 호출 회로 차단 패턴이 제공하는 핵심 기능

  1. 빠른 실패: 원격 서비스가 저하를 야기하면, 빠르게 실패함으로써 애플리케이션 전체를 다운 시킬 수 있는 문제(자원 고갈 문제)를 방지한다.
  2. 원만한 실패: 타임아웃이나 빠른 실패 방법을 사용하는 회로 차단기 패턴으로 대체 매커니즘을 찾을 수 있도록 원만하게 실패된다.
  3. 원활한 회복: 회로 차단기는 요청 자원을 모니터링 하며 사람의 개입 없이 자원 접근을 다시 허용할 수 있다.