-회로 차단기 패턴
품질 높은 서비스를 위해서는 장애가 전혀 없도록 해야겠지만 현실에서는 쉽지 않은 일이다. 오류는 언제든지 발생을 할 수 있고 이런 오류는 문제를 해결하는 시간이 오래 걸릴 수 있다. 부분적인 시스템 장애는 전체 시스템의 장애로 퍼질 수 있는데, 우리는 한 시스템에서 장애가 전체 시스템의 실패로 진행되지 않도록 설계/운영을 섬세하게 아주 잘해야 한다. 웹서비스에서 로그인 정보 조회 및 세션 연동하는 프로세스가 있다고 가정하자. 세션 연동 기능에 장애가 발생하면 어떤 일이 발생할지 생각해보자. 웹서비스에서는 세션 정보를 정상적으로 받아 올 때까지 서비스는 계속 대기해야 하는가?
Circuit Breaker Pattern(회로 차단기 패턴)은 문제가 발생한 지점을 감지하여 실패하는 작업을 반복적으로 실행하지 않도록 방지한다. 시스템 장애 확산을 막고 오류 응답을 빠르게 반환하여 사용자는 불필요하게 대기하지 않도록 한다.
Circuit Breaker(회로 차단기)는 세 가지 상태를 갖는다.
연결 서비스가 정상이라고 판단(회로 차단기 닫힘) - 일반적인 경우에는 회로 차단기가 닫힘 상태로 서비스를 유지한다. 만약 오류 수가 지정된 수치를 초과하는 경우 서비스에 장애가 심각하다고 판단하여 회로 차단기 열림 상태로 전환한다.
연결 서비스가 비정상이라고 판단(회로 차단기 열림) - 요청이 즉시 실패하고 예외가 반환한다.
제한된 연결 서비스만 정상이라고 판단(회로 차단기 반열림) - 복구 중인 서비스에 많은 트래픽이 몰리는 경우를 방지하기 위해서 제한된 요청만 허용한다.
서비스를 운영하다 보면 이런 장애를 많이 경험하는데 갑작스럽게 서비스를 정상을 변경하면 트래픽이 한꺼번에 몰리게 되어서 오히려 추가적인 장애를 발생하는 경우를 자주 경험하였다. 그래서, 제한된 연결 서비스만 정상으로 판단하는 반열림 상태도 매우 중요한 개념이다.
빠르게 실패하기 : 연결 서비스에 장애가 발생을 한다면 빠르게 실패한다.
우아하게 실패하기 : 사용자의 의도를 수행하기 위해 예외처리 또는 방어 로직을 우아하게 수행한다.
로그 남기기 : 모든 실패한 요청을 기록해야 한다.
안전하게 복구하기 : 개발자 또는 운영자가 개입하지 않아도 다시 정상 서비스로 전환할 수 있어야 한다. Circuit Breaker(회로 차단기)의 상태의 닫힘, 열림, 반열림 상태를 어떤 기준으로 전환할지에 대한 섬세한 설계가 중요하다.
생략
Retry Pattern
Health-Endpoint-Monitoring Pattern
Fallback Processing Pattern
Bulkheads Pattern
Client-side Load Balancing Pattern
https://docs.microsoft.com/ko-kr/azure/architecture/patterns/circuit-breaker
http://microservices.io/patterns/reliability/circuit-breaker.html
https://martinfowler.com/bliki/CircuitBreaker.html
Release It (성공적인 출시를 위한 소프트웨어 설계아 배치) - 마이클 나이가드 저 - 위키북스