10
2014. 03. 06 넷플릭스 무중단 시스템 오픈 소스 컨설팅

Fault Tolerance Architecture by Netflix

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Fault Tolerance Architecture by Netflix

2014. 03. 06

넷플릭스 무중단 시스템

오픈 소스 컨설팅

Page 2: Fault Tolerance Architecture by Netflix

2 - Internal Use Only -

Netflix

- 전세계 download traffic 30% 차지

- 아마존에 수천 대의 서버 운영

- LoR(Latency of Response) 감소를 목표

- Chaos of Monkey 시스템을 초기 구축

- 실제 데이터를 이용한 시스템 테스트에 주력

Chaos of Monkey : AWS 인스턴스를 무작위로 kill 시키는 시스템

Page 3: Fault Tolerance Architecture by Netflix

3 - Internal Use Only -

Resilient Architecture

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 등을 사용하여 외부 서비스에 대한 가용 여부를 체크 후 처리

Resilient Architecture를 만들기 위해 Circuit Breaker Pattern를 사용

Page 4: Fault Tolerance Architecture by Netflix

4 - 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 사용가능

Page 5: Fault Tolerance Architecture by Netflix

5 - 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 output is:

Writing to stdout: Entering function y.

Writing to stdout: Step1 completed.

Sending via e-mail: Step1 completed.

Writing to stdout: An error has occurred.

Sending via e-mail: An error has occurred.

Writing to stderr: An error has occurred. */

Usage : 처리할 데이터에 대한 체인을 구성하여 각 경우에 따른 처리 방식을 변경

Page 6: Fault Tolerance Architecture by Netflix

6 - Internal Use Only -

Fault Tolerance

• 하루 10억건의 요청처리를 하기 위해 각 레이어에서 최적의 프로토콜을 각 팀이 선택하도록 설계(JSON, Thrift, Google PB, etc)

• 각 서버 구현팀에서는 자바 클라이언트 라이브러리를 배포

• 아래의 항목을 직접 구현하여 사용

• 네트워크 타임아웃 및 재시도

• 스레드 풀

• 세마포(java.util.concurrent.Semaphore)

• Circuit Breaker(체크 용도)

최지웅 의견 : 기존 SOA 구현 방식 중 하나인 SCA(Service Component Architecture) 스타일과 비슷함

Page 7: Fault Tolerance Architecture by Netflix

7 - 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에 전달

Page 8: Fault Tolerance Architecture by Netflix

8 - Internal Use Only -

Dependency Flow

Thread/Network Timeout 설정

Worst case sequence

Connect

Read

Retry

Connect

Read

의존성 관계를 실시간 변경 가능

이와 같은 구조로 현재 무중단

10개월째 운영

Page 9: Fault Tolerance Architecture by Netflix

9 - Internal Use Only -

Lesson Learn

Fault Tolerance를 필수 요소라 여기고 실제 데이터를 활용하여 강력한 테스트 수행

CircuitBreaker, Fallback 구조를 활용한 DependencyCommand를 활용하여 각 레이어 프로그램을 직접

구현

Dashboard를 통해 10초간의 상황을 파악(초당 20만건 처리)

문제가 발생했을 경우 사용자 요청을 다양한 대체 처리(Fallback: Cache, Fail Silent, etc)

성능 문제나 설정 실수로 전체 시스템이 다운되지 않도록 설정을 실시간으로 변경(SPOF를 만들지 않도록 함)

Page 10: Fault Tolerance Architecture by Netflix

10 - Internal Use Only -

OPEN

SHARE

CONTRIBUTE

ADOPT

REUSE