Fault Tolerance Architecture by Netflix
Upcoming SlideShare
Loading in...5
×
 

Fault Tolerance Architecture by Netflix

on

  • 696 views

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

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

Statistics

Views

Total Views
696
Slideshare-icon Views on SlideShare
689
Embed Views
7

Actions

Likes
5
Downloads
14
Comments
0

1 Embed 7

http://www.slideee.com 7

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Fault Tolerance Architecture by Netflix Fault Tolerance Architecture by Netflix Presentation Transcript

    • 넷플릭스 무중단 시스템 2014. 03. 06 오픈 소스 컨설팅
    • Netflix - 전세계 download traffic 30% 차지 - 아마존에 수천 대의 서버 운영 - LoR(Latency of Response) 감소를 목표 - Chaos of Monkey 시스템을 초기 구축 - 실제 데이터를 이용한 시스템 테스트에 주력 Chaos of Monkey : AWS 인스턴스를 무작위로 kill 시키는 시스템 2 - Internal Use Only -
    • 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 -
    • 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 -
    • 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. */
    • Fault Tolerance • 하루 10억건의 요청처리를 하기 위해 각 레이어에 서 최적의 프로토콜을 각 팀이 선택하도록 설계 (JSON, Thrift, Google PB, etc) • 각 서버 구현팀에서는 자바 클라이언트 라이브러 리를 배포 • 아래의 항목을 직접 구현하여 사용 • 네트워크 타임아웃 및 재시도 • 스레드 풀 • 세마포(java.util.concurrent.Semaphore) • Circuit Breaker(체크 용도) 최지웅 의견 : 기존 SOA 구현 방식 중 하나인 SCA(Service Component Architecture) 스타일과 비슷함 6 - Internal Use Only -
    • 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 -
    • Dependency Flow Thread/Network Timeout 설정  Worst case sequence  Connect  Read  Retry  Connect  Read 의존성 관계를 실시간 변경 가능 이와 같은 구조로 현재 무중단 10개월째 운영 8 - Internal Use Only -
    • Lesson Learn Fault Tolerance를 필수 요소라 여기고 실제 데이터를 활용하여 강력한 테스트 수행 CircuitBreaker, Fallback 구조를 활용한 DependencyCommand를 활용하여 각 레이어 프로그램을 직접 구현 Dashboard를 통해 10초간의 상황을 파악(초당 20만건 처리) 문제가 발생했을 경우 사용자 요청을 다양한 대체 처리(Fallback: Cache, Fail Silent, etc) 성능 문제나 설정 실수로 전체 시스템이 다운되지 않도록 설정을 실시간으로 변경(SPOF를 만들지 않도록 함) 9 - Internal Use Only -
    • OPEN SHARE CONTRIBUTE ADOPT REUSE 10 - Internal Use Only -