써킷 브레이커(Circuit Breaker)

해결하고 싶은 문제

백엔드(웹서버, 스토리지, 데이터베이스) 장애에도 동작하는 서비스를 구축하고 싶다.

솔루션/패턴 설명

캐시서버는 원본서버의 상태를 일정시간(Time To Live)동안 저장한 뒤 대신 응답하는 메커니즘이다.

../../_images/dgm013.png

원본 장애발생시 캐싱된 콘텐츠의 TTL을 자동으로 늘려주어 장애를 노출시키지 않는다.

구현

  • 보호하고 싶은 서비스 앞에 M2 를 배치한다. (=HTTP 통신이 가능하다.)

  • 서비스(=가상호스트)별로 적절한 TTL을 설정한다.

    # functions.network.cache.ttl
    
    "resCode": {
      "res2xx": {
        "sec": 1800,
      },
      "noCache": {
        "sec": 60
      }
    }
    
  • 장애 상황에서 원본 오동작으로 4xx , 5xx 응답이 올 수 있다. 콘텐츠가 캐시에서 사라지지 않도록 비정상 TTL연장 기능을 활성화시킨다.

    # functions.network.cache.ttl
    
    "policies": {
      "extendBy4xx": true,
      "extendBy5xx": true,
      "unvalidatableObjectResCode": 0
    }
    

Note

M2 는 콘텐츠 갱신시점에 원본서버와 연결이 안되거나 전송지연이 발생할 경우 자동으로 TTL을 연장한다.

장점/효과

캐싱된 콘텐츠라면 장애가 클라이언트에게 노출되지 않는다.

주의점

엔터프라이즈 서비스에서는 L4/Load Balancer등을 이용해 장애서버를 배제한다. 캐시서버 운영도 동일한 방식을 사용한다.

기타

자주 변경되는 콘텐츠라면 TTL 을 0초로 설정한다. 평상시에는 대부분의 응답을 원본서버에서 처리하다 장애상황이 발생하면 캐시서버가 대신 응답한다.