써킷 브레이커(Circuit Breaker)

해결하고 싶은 문제

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

솔루션/패턴 설명

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

../../_images/dgm013.png

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

구현

  • cache 는 기본으로 활성화된다.

  • 콘텐츠에 알맞은 적절한 ttl 을 설정한다. 0초도 가능하다.

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

Note

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

장점/효과

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

주의점

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

기타

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