IT/AWS

[Netflix] Part 5 - API 배포 준비

물통꿀꿀이 2018. 12. 22. 23:43

https://medium.com/netflix-techblog/preparing-the-netflix-api-for-deployment-786d8f58090d

Netflix에서 API 배포를 준비하면서 고민했던 부분들에 대해 소개하는 글이다.


그림 1. API Hourglass


그림 1에서 쉽게 확인 할 수 있듯이, Netflix 뿐만 아니라 API는 사용자와 백엔드 서비스간에 중요한 소통 창구* 이다.

*API에 의해 양 끝단(endpoint)이 많은 영향을 받을 수 밖에 없다.

이러한 API 역할로 인해 서비스의 기능 추가/삭제시 API 또한 맞춰서 작업을 진행해야 한다. 그래서 다음과 같은 고려가 필요하다.

- 기존에 사용하고 있는 사용자들에게 영향을 주지 않고 API 수정 및 배포가 이루어져야 함 

- 서비스(Backend Layer)에 맞춰 발 빠르게 작업이 이루어져야 함


그래서 Netflix는 API의 수정 및 배포가 빠르고 원활하게 수행될 수 있도록 Software Delivery pipeline*을 구상하였다. 

* CD(Continuous Delivery)를 목표로 함


그림 2. Delivery Pipeline


그림 2는 Netflix에서 구성한 Software Delivery pipeline이다. 간단히 그림에 적혀있는 순서를 살펴보면 다음과 같다.

1. 개발자가 로컬 환경에서 code를 테스트한다. 

2. 로컬에서 테스트된 code가 repository에 commit 된다.

3-5. 모든 commit된 코드는 CI(Continuous Integration) 서버에서 빌드/테스트/배포 과정을 거치는데, 빌드와 테스트가 끝나면 Pre-Production 환경에 배포한다. (Netflix는 새로 수정된 코드가 배포되기까지 대략 1시간 정도 걸린다.)

6. Daily 푸시나 수동으로 Production 브랜치에 commit되면, Canary 테스트를 위해 Canary 클러스터에 배포한다. 

(운영 환경에 바로 반영하기 보다는 Canary 테스트를 진행하고 이후 통과했을 때, 실제 운영 환경에 배포한다.)


다음으로 테스트에 대해 알아보자.

아래의 그림 3에서 확인 할 수 있지만, 그림 2와 연관된다. 그림 2에서 1-4 과정에서 사용되는 테스트이기 때문이다.



그림 3. Software Testing Pyramid



그림 3을 보고 하나씩 살펴보자.


- Local Development / Test iterations

로컬 환경에서 수행하는 테스트로 단위 테스트나 기능(functional) 테스트이다. 

(테스트 시간이 다른 것에 비해 빠르기 때문에 개발 과정 중 몇 번이고 테스트 할 수 있다.)


- Continuous Integration**

CI 서버에서 수행하는 부분으로 Code가 repository에 commit이 될 때, 의존성 업데이트 및 code merge를 진행하기 위해 단위 테스트 등을 수행한다.


- Contract Validations**

CI 서버에서 수행하는 부분으로 Code의 변경된 부분을 검사한다. 

(변경된 부분이 없으면 pipeline을 중지한다.)

** 2개의 과정이 결국 CI 서버 내부적으로 이루어지고 수행하는 역할이 비슷하기 때문에 하나의 Continuous Integration으로 봐도 될 것 같다.


- Integration Tests

API 테스트와 같이 수정된 코드를 다른 모듈(그 이상의 단위도)들과 연계해서 테스트하는 것이다. 클라우드와 같은 분산 환경에서는 응답 시간의 문제로 쉽지 않다.

때문에 Netflix는 Integration Tests를 수행할 때 아래와 같은 기본 방침을 가진다.

1) API 응답 내용보다는 구조에 초점을 맞춘다. (응답과 관련된 데이터는 Provider 쪽에서 검사)

2) Cold cache와 connection은 테스트 전에 미리 준비한다.

3) Fallback 응답이 발생할 때는 feedback을 제공할 수 있도록 설계한다.

4) Bug tracking system을 자동화 한다. 

이 외에도 Integration Tests의 가장 중요한 부분은 Metric을 점검하여 해당 시스템의 임계치를 넘는지 확인하는 것이다. (넘어가면 pipeline 중지)


- User Acceptance Tests

사용자* 테스트이다. 

* 사용자는 API와 연계된 부분의 사람들 등등을 의미한다.


- Canary Analysis

테스트의 마지막 단계로 실제 운영 환경에 배포하기전에 시스템 관점에서 분석하는 것이다.