콘텐츠로 이동

2022 11 14

2022-11-14

Fault Tolerance

  • 특성
    • 개별 구성품만의 특징이 아닌, 머신간의 제휴에 대한 규칙 특성
    • TCP에서의 패킷 통신 네트워크 내에서 과부하 => 신뢰성이 높은 쌍방향 통신하도록
    • 시스템 안에서는 상태 예외적인 경우를 고려하여 대처할 수 있도록 시스템을 구축할 것
    • 자기 안정성을 갖게 하는 것에 의해 시스템이 오류없는 상태로 수렴시키는 것
    • 이중화를 하는 것이 좋음
  • 장애 복구 방식
    • Roll-Forward 복구
      • 그 시점의 시스템 상태로 복구 실시
    • Roll-Back 복구
      • 시스템 상태를 약간 이전으로 되돌려 재개
  • 이중화 시스템
    • Replication (레플리케이션)
      • 동일한 시스템 복수로 준비해 병렬로 실행시킴
    • Redundancy (다중화)
      • 동일한 시스템 복수로 준비해 장애 일어나면 보조 시스템 전환
    • Diversity (다양화)
      • 같은 사양에 하드웨어 시스템을 복수로 준비하여 복제화와 같이 운용

MSA 회복성 패턴

  • 참고: https://dev.gmarket.com/40
  • MSA 환경에서의 장애 양상
    • 클라이언트는 정상 동작중인 다른 서버를 이용할 수 있음
    • 독립적인 서비스들이 서로 API를 호출하여 통신하는 MSA 구조에서는 여러가지 이유로 호출이 안될 수 있음
    • 네트워크 문제로 http 통신에 문제가 생겨 원격 서비스 호출 실패할 수도 있음
  • 클라이언트 회복성 패턴
    • [Circuit Breaker]
      • 응답 지연되는 원격 서비스 차단하여 반복 호출 금지
      • 두꺼비집 설치와 비슷
    • [Fallback]
      • 서비스를 차단한 경우 예외를 발생시키는 대신 "대비책 제공"하거나 "미리 준비된 동작" 실행
      • 추천 서비스 문제 => 인기 상품 응답하기
    • [Bulkhead]
      • 응답시 지연되는 서비스에 자원을 모두 소진하지 않도록 쓰레드 풀을 격리하는 것
      • 다른 부분에 영향을 안주도록 격벽을 두는 것
      • 시스템 전체로 전파되지 않도록 빠른 실패와 실패 격리
  • Netflix Hystrix

    • 라이브러리 추가하면 회로 차단기 패턴을 구현할 수 있음 ㄷㄷ
    • 원격 서비스 의존 메서드에 @HystrixCommand 활용하면 회로 차단기 패턴 적용 가능
    • 여러 설정을 줌으로써 차단을 걸고, 차단 해제할 수 있음
      @HystrixCommand(
          commandProperties={
              @HystrixProperty(name="metrics.rollingStats.timeInMilliseconds", value="10000"),
              @HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="20"),
              @HystrixProperty(name="circuitBreaker.errorThresholdPercentage", value="50"),
              @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value="5000")
          }
      )
      public void callOtherServer() {
          // Some works
      }
      
    • 회로 차단기 별로 격리된 쓰레드 풀을 지정할 수 있음 (Bulkhead)
      @HystrixCommand(
          fallbackMethod = "myFallbackMethod",
          threadPoolKey  = "myThreadPool",
          threadPoolProperties = {
              @HystrixProperty(name="coreSize", value="20"),
              @HystrixProperty(name="maxQueueSize", value="10"),
          })
      public void callSameServer() throws InterruptedException {
          // Some works
      }