마이크로 서비스 아키텍처: 회복 시스템 (이론)

xellos·2022년 7월 3일
0

MSA

목록 보기
5/5

Intro

모든 시스템, 특히 분산 시스템은 장애를 겪는다. 이러한 장애에 대응하는 애플리케이션 구축 방법을 찾는 것은 모든 소프트웨어 개발자에게 중요한 일이다. 하지만 회복력을 갖춘 시스템을 구축하는 것에 대해 대부분의 소프트웨어 엔지니어는 일부 인프라 스트럭처나 핵심 서비스의 완전한 장애만 고려한다.

이러한 접근 방식으로 시스템 컴포넌트가 완전히 (종종 엄청나게) 손실될 것을 고려하지만 회복력 있는 시스템은 구축하는데 생기는 사소한 문제만 해결할 뿐이다. 서비스 하나가 충돌하면 쉽게 감지할 수 있고 애플리케이션은 그 서비스를 우회할 수 있다.

하지만 서비스가 느려질 때 성능 저하를 감지하고 우회하는 것은 다음 이유로 매우 어렵다.

1) 서비스 저하는 간헐적으로 발생하고 확산될 수 있다.

서비스 저하는 사소한 부분에서 갑자기 발생할 수 있다. 순식간에 애플리케이션 컨테이너가 쓰레드 풀을 모두 서진해 완전히 무너지기 전까지 장애 징후는 일부 사용자가 문제점을 불평하는 정도로 나타날 것이다.

2) 원격 서비스 호출은 대개 동기식이며 오래 걸리는 호출을 중단하지 않는다.

서비스 호출자에게는 호출이 영우 수행되는 것을 방지하는 타임아웃 개념이 없다. 애플리케이션 개발자는 서비스를 호출해 작업을 수행하고 서ㅣ븟가 응답할 때까지 대기한다.

3) 애플리케이션은 대개 부분적인 저하가 아닌 원격 자원의 완전한 장애를 처리하도록 설계된다.

서비스가 완전히 다운되지 않는다면 애플리케이션이 서비스를 계속 호출하고 빨리 실패하지 않는 일이 자주 발생한다. 애플리케이션은 제대로 동작하지 않는 서비스를 계속 호출할 것이다. 호출하는 애플리케이션이나 서비스는 정상적으로 저하될 수 있지만 자원 고갈로 비정상적으로 종료될 가능성이 높다.

제대로 동작하는 원격 서비스로 야기되는 문제가 심각한 이유는 탐지하기 어려울 뿐만 아니라 애플리케이션 전체 생태계에 미치는 파급 효과가 크기 때문이다. 안전 장치가 없다면 제대로 동작하지 않는 서비스 하나가 여러 애플리케이션을 짧은 시간 동안 다운시킬 수 있다.

클라이언트 회복성 패턴이란?

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

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

클라이언트의 회복성 패턴은 네 가지가 있는데 아래와 같다.
1. 클라이언트 측 부하 분산
2. 회로 차단기(circuit breaker)
3. 폴백(fallback)
4. 벌크헤드(bulkhead)

1) 클라이언트 측 부하 분산

클라이언트 측 부하 분산은 클라이언트가 넷플릭스 유레카 같은 서비스 디스커버리 에이전트를 이용해 서비스의 모든 인스턴스를 검색한 후 해당 서비스 인스턴스의 실제 위치를 캐싱하는 것이다.

서비스 소비자가 서비스 인스턴스를 호출해야 할 때마다 클라이언트 측 로드 밸런서는 서비스 위치 풀에서 관리하는 서비스 위치를 하나씩 전달한다.

클라이언트 측 로드 밸런서는 서비스 클라이언트와 소비자 사이에 위치하므로 서비스 인스턴스가 에러를 전달하거나 불량 작동하는지 감지한다. 클라이언트 측 로드 밸런서가 문제를 감지할 수 있다면 가용 서비스 위치 풀에서 문제가 된 서비스 인스턴스를 제거해 서비스 호출이 그 인스턴스로 전달되는 것을 막는다.

2) 회로 차단기

소프트웨어 회로 차단기는 원격 서비스 호출을 모니터링한다. 호출이 오래걸리다면 회로 차단기가 중재해 호출을 중단한다. 회로 차단기는 원격 자원에 대한 모든 호출을 모니터링하고 호출이 필요한 만큼 실패하면 회로 차단기가 활성화되어 빨리 실패하게 만들여, 고장난 자원은 더 이상 호출되지 않는다.

3) 폴백 처리

폴백 패턴을 사용하면 원격 서비스에 대한 호출이 실패할 때 예외를 발생시키지 않고 서비스 소비자가 대체 코드 경로를 실행해 다른 방법으로 작업을 수행할 수 있다. 일반적으로 이 패턴은 다른 데이터 소스에서 데이터를 찾거나 향후 처리를 위해 사용자 요청을 쿠에 입력하는 작업과 연관된다. 사용자 호출에 문제가 있다고 예외를 표시하지 않지만 나중에 해당 요청을 수행할 수 있다고 전달받은 수 있다.

4) 벌크 헤드

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

클라이언트 회복성이 중요한 이유

회로를 차단하면 다음 세가지 일이 발생한다.
1. 서비스 B는 현재 회로 차단기가 타임아웃 하기 전에 문제가 있다는 것을 즉시 안다.
2. 서비스 B는 완전히 실패하거나 대체 코드(폴백)를 사용하는 도치를 취하는것 중에 선택할 수 있다.
3. 회로 차단기가 차단된 동안 서비스 B는 서비스 C를 호출하지 못하므로 서비스 C에 복구할 수 있는 여유가 생긴다. 이 기회를 이용해 서비스 C는 숨돌릴 틈을 갖고 서비스 저하로 발생되는 연쇄 장애를 막을 수 있다.

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

1. 빠른 실패

원격 서비스가 저하를 겪으면 애플리케이션은 빨리 실패함으로써 애플리케이션 전체를 다운 시킬 수 있는 자원 고갈 이슈를 방지한다.

2. 원만한 실패

타임아웃과 빠른 실패 방법을 사용하는 회로 차단기 패턴으로 애플리케이션 개발자는 원만하게 실패하거나 대체 메커니즘을 찾을 수 있다.

3. 원활한 회복

회로 차단기 패턴이 중개자 역할을 한다면 회로 차단기는 요청 자원이 온라인 상태인지 주기적으로 확인하고, 사람의 개입 없이 자원 접근을 다시 허용할 수 있다.

0개의 댓글