[오픈소스컨설팅]Fault Tolerance Architecture by Netflix

1,535 views
1,245 views

Published on

Chain of Responsibility, CircuitBreaker Implementation 등을 통한 무중단 아키텍처 구현 사례

Published in: Technology

[오픈소스컨설팅]Fault Tolerance Architecture by Netflix

  1. 1. 넷플릭스 무중단 시스템 2014. 03. 06 오픈 소스 컨설팅
  2. 2. Netflix - 전세계 download traffic 30% 차지 - 아마존에 수천 대의 서버 운영 - LoR(Latency of Response) 감소를 목표 - Chaos of Monkey 시스템을 초기 구축 - 실제 데이터를 이용한 시스템 테스트에 주력 Chaos of Monkey : AWS 인스턴스를 무작위로 kill 시키는 시스템 2 - Internal Use Only -
  3. 3. Resilient Architecture Resilient Architecture를 만들기 위해 Circuit Breaker Pattern를 사용 External system is marked as available or circuit breaker decided to allow a retry External system is marked as available, connection succeeded Usage : Memcache, Redis 등을 사용하여 외부 서비스에 대한 가용 여부를 체크 후 처리 3 - Internal Use Only -
  4. 4. CircuitBreaker Implementation Custom Fallback  클라이언트 라이브러리에서 호출할 수 있는 대체(fallback) API를 직접 구성하여 처리  API 서버에서 캐시된 데이터를 사용하는 것도 가능 Fail Silent  Fallback 메소드에서 단순히 null값을 리턴함으로써 대상 시스템의 문제를 처리 Fail Fast  Fallback 대상이 없을 경우 client 측으로 5XX 응답을 던짐. 대신 API 서버에 대한 상태를 가지고 복구되었을 경우 빠르게 접속하도록 구성 Code 레벨에서는 Command Pattern, Chain of Responsibility Pattern 사용가능 4 - Internal Use Only -
  5. 5. Chain of Responsibility abstract class Logger { public static int ERR = 3; public static int NOTICE = 5; public static int DEBUG = 7; protected int mask; // The next element in the chain of responsibility protected Logger next; public Logger setNext(Logger log) { next = log; return log; } public void message(String msg, int priority) { if (priority <= mask) { writeMessage(msg); } } if (next != null) { next.message(msg, priority); } abstract protected void writeMessage(String msg); } class StdoutLogger extends Logger { public StdoutLogger(int mask) { this.mask = mask; } protected void writeMessage(String msg) { System.out.println("Writing to stdout: " + msg); } } class EmailLogger extends Logger { public EmailLogger(int mask) { this.mask = mask; } protected void writeMessage(String msg) { System.out.println(“Sending via email: " + msg); } } class StderrLogger extends Logger { public StderrLogger(int mask) { this.mask = mask; } protected void writeMessage(String msg) { System.out.println(“Sending to stderr: " + msg); } } public class ChainOfResponsibilityExample { public static void main(String[] args) { // Build the chain of responsibility Logger logger, logger1,logger2; logger = new StdoutLogger(Logger.DEBUG); logger1 = logger.setNext(new EmailLogger(Logger.NOTICE)); logger2 = logger1.setNext(new StderrLogger(Logger.ERR)); // Handled by StdoutLogger logger.message("Entering function y.", Logger.DEBUG); // Handled by StdoutLogger and EmailLogger logger.message("Step1 completed.", Logger.NOTICE); // Handled by all three loggers logger.message("An error has occurred.", Logger.ERR); } } /* The Writing Writing Sending Writing Sending Writing Usage : 처리할 데이터에 대한 체인을 구성하여 각 경우에 따른 처리 방식을 변경 5 - Internal Use Only - output is: to stdout: Entering function y. to stdout: Step1 completed. via e-mail: Step1 completed. to stdout: An error has occurred. via e-mail: An error has occurred. to stderr: An error has occurred. */
  6. 6. Fault Tolerance • 하루 10억건의 요청처리를 하기 위해 각 레이어에 서 최적의 프로토콜을 각 팀이 선택하도록 설계 (JSON, Thrift, Google PB, etc) • 각 서버 구현팀에서는 자바 클라이언트 라이브러 리를 배포 • 아래의 항목을 직접 구현하여 사용 • 네트워크 타임아웃 및 재시도 • 스레드 풀 • 세마포(java.util.concurrent.Semaphore) • Circuit Breaker(체크 용도) 최지웅 의견 : 기존 SOA 구현 방식 중 하나인 SCA(Service Component Architecture) 스타일과 비슷함 6 - Internal Use Only -
  7. 7. Process Sequence 1. Command Pattern를 통한 요청 생성 2. 동기/비동기 요청에 따라 Task를 분리하여 호출 3. Circuit check의 정보를 통해 오픈여부를 확인 4. 가용할 경우 running 상태로 진입시키고 작업을 수행. 스레드 포화일 경우 fast fail시킨 후 fallback 대상 확인 후 재처리 시도 5. 요청 스레드 수행에 대한 결과를 확인 6. 작업이 성공할 경우 정상적인 응답을 요청 측으로 전달. 실패할 경우 예외 반환함으로써 fallback 대상 확인 후 재처리 시도 7. Timeout 등에 의한 health 상태를 circuit controller에 전달 7 - Internal Use Only -
  8. 8. Dependency Flow Thread/Network Timeout 설정  Worst case sequence  Connect  Read  Retry  Connect  Read 의존성 관계를 실시간 변경 가능 이와 같은 구조로 현재 무중단 10개월째 운영 8 - Internal Use Only -
  9. 9. Lesson Learn Fault Tolerance를 필수 요소라 여기고 실제 데이터를 활용하여 강력한 테스트 수행 CircuitBreaker, Fallback 구조를 활용한 DependencyCommand를 활용하여 각 레이어 프로그램을 직접 구현 Dashboard를 통해 10초간의 상황을 파악(초당 20만건 처리) 문제가 발생했을 경우 사용자 요청을 다양한 대체 처리(Fallback: Cache, Fail Silent, etc) 성능 문제나 설정 실수로 전체 시스템이 다운되지 않도록 설정을 실시간으로 변경(SPOF를 만들지 않도록 함) 9 - Internal Use Only -
  10. 10. OPEN SHARE CONTRIBUTE ADOPT REUSE 10 - Internal Use Only -

×