IT/AWS

[Netflix] Part 3 - Resilient API

물통꿀꿀이 2018. 12. 18. 11:54

*https://medium.com/netflix-techblog/making-the-netflix-api-more-resilient-a8ec62159c2d

이번 글에서는 Netflix가 제공하는 API를 어떻게 resilient*하도록 만들었는지 소개하려고 한다.

*해당 단어의 번역은 회복성 있는 즉, 원상태로 돌아온다는 뜻이지만 원문 그대로가 이해하기 쉬울 것 같아 원문을 그대로 사용한다.


Netflix의 내부 서비스에 문제가 발생하면, API에도 영향을 줄 수 있다. 다시 말해서 API에도 영향이 미친다는 것은 사용자에게도 영향을 준다는 의미이다. 

때문에 Netflix API 팀은 high availability(고가용성), resiliency(탄력성)을 유지하여 사용자에게 최상의 서비스를 제공하기 위해 노력하였다.


Principles of Resiliency

다음은 API를 보다 resilient하게 만들기 위한 기본 원리이다.

- 서비스 의존성(dependency)에 문제가 있을 때, 사용자에 영향을 주지 말아야 한다.

- API는 서비스 의존성에 문제가 있을 때, 자동으로 수정 조치(corrective action)을 취해야 한다.

- API는 15-30 분 전, 어제, 지난 주 등 일어난 일 이외에 현재 진행 상황을 보여 줄 수 있어야 한다.


Keep the Streams Flowing

서버에서 문제가 발생하더라도 Netflix의 streaming은 계속 되어야 한다.

이를 위해서 Netflix는 서비스 의존성에 문제가 발생하더라도 fallback 메커니즘을 사용할 수 있도록 API를 재구성*하였다.


*API 재구성 

- 각 호출의 결과를 추적

- 서비스가 문제가 너무 많을 때, 요청을 중지하고 대체 응답을 제공

- 주기적으로 서비스에 대한 일부 요청을 허용, 성공하면 모든 요청을 허용 (모든 트래픽에 대해 오픈)


위에서 언급한 API 재구성의 방법은 Circuit Breaker 패턴과 비슷하다.

하지만 Netflix에서는 아래의 몇 가지 점에서 기본적인 Circuit Breaker 패턴을 조금 더 낫게 개선하였다.

- 원격 서비스 요청에 대한 timeout이 발생

- 서비스 의존성과 연결하는데 사용되는 thread pool과 제한된 작업 대기열은 100%

- 서비스 의존성과 연결하는데 사용되는 클라이언트 라이브러리는 예외 발생


그리고 해당 패턴은 서비스에 문제가 발생해서 정의된 임계값을 초과하면, 해당 서비스에 대한 circuit을 차단하고 fallback을 제공한다.

때문에 circuit breaker 과 같은 패턴으로 구현된 서비스는 다음 3가지 방법 중 하나를 사용하여 fallback을 구현한다.

1. Custom fallback

- 서비스의 클라이언트 라이브러리가 호출 할 수 있는 fallback method 제공 

- API 서버 (cookies 또는 local JVM cache)에서 로컬로 사용 가능한 데이터를 사용하여 fallback response 생성

2. Fail silent :호출된 서비스에서 제공하는 데이터가 요청 클라이언트에 다시 전송 될 경우

- Fallback method는 null 반환

3. Fail fast : fallback method가 없고 클라이언트가 5xx 응답을 얻는 경우

- 서비스에 문제가 다시 발생했을 때, 빠르게 시스템을 복구


물론 모든 서비스 의존성을 고려해서 완벽한 fallback coverage를 만드는 것은 쉽지 않다.

따라서 Neflix에서는 fail silent 및 fail fast 방식 또한 현실적으로 합리적인 대안으로 생각한다.


Dash board

대시보드를 통해 시스템이 어떻게 동작하고 있는지 확인 할 수 있다. 


그림 1. Dash board


그림 1이 실제 사용하고 있는 대시보드이다. 

한 번 살펴보면, 빨강색의 80%는 데이터베이스에 대한 에러율을 표시하며 Open, Closed는 200개의 서버 인스턴스 중 157개는 정상이고 나머지 43개는 fallback 응답을 하고 있다는 의미이다. 

https://vimeo.com/33359539

*해당 URL을 통해 실제 동작하고 있는 대시보드를 확인 할 수 있다.


이렇듯, 대시보드는 통해 현재 상황을 보다 쉽게 파악하고 대응하는데 도움을 준다.