이번 글에서는 새롭게 변화된 Zuul에 대해 Netflix에서 겪은 여러 과정을 소개하려고 한다.
그런데 위의 원본 페이지에서도 확인 할 수 있듯이, Netflix에서는 Zuul 2라고 언급한다. 사실 Zuul 1과 2의 기본 기능*은 거의 같다고 할 수 있다.
* Zuul 의 기능 요약 (이외에도 여러 가지가 있음)
- 요청 라우팅
- 개발자 테스트
- 외부 공격 방어
다만, Zuul 1과 2의 차이점은 Zuul 2에서는 Netty를 사용하여 asynchronous, non-blocking을 활용하고 있다는 것이다.
즉, 이를 통해 Netflix에서는 대규모의 상황*에서도 persistent connection을 유지 할 수 있게 되었다.
* Netflix의 사용자는 8천 3백만 명이 넘음
간단하게 생각하면 framework를 하나 도입했을 뿐이지만, 결과적으로 Netflix는 다음의 장점을 얻을 수 있게 되었다.
- 디바이스 요청 감소
- 디바이스 성능 향상
- 많은 제품 기능 추가
- 등등...
조금 기술적으로 들어가면, Zuul 1과 2의 차이점은 네트워크 구성 방식이다.
- Zuul 1
Servlet framework로 구성되어 내부적으로 Blocking과 multithreaded를 사용한다.
즉, 요청이 들어오면 thread pool에서 thread를 할당하여 요청을 처리 할 수 있도록 한다.
(즉, thread당 connection 하나를 사용하여 요청을 처리)
그림 1. Multithreaded System Architecture
- Zuul 2
내부적으로 asynchronous를 사용한다.
즉, 요청 및 응답은 이벤트 및 콜백을 통해 처리된다.
Zuul 2로 넘어오면서 바뀐 네트워크 기술(asynchronous)의 큰 장점은 오버헤드가 적다는 것이다.
일반적으로 한 개의 thread가 모든 요청과 응답을 처리하고,(보통 CPU Core당 thread 한 개) 이벤트와 콜백을 사용하기 때문에..
새로운 thread를 만드는데의 메모리와 여러 시스템 리소스를 덜 사용한다.
(+ 시스템 레벨 Cache 사용 및 더 적은 context switching)
그림 2. Asynchronous and Non-blocking System Architecture
이렇듯 Zuul 2로 넘어오면서 아키텍처도 바뀌게 되었다.
사실 이론상으로는 Zuul 2가 이점이 더 많은데 실제 환경에서도 많은 이점을 얻었는지 의문점이 생긴다.
이런 의문에 Netflix는 사실 큰 효율성은 없지만 많은 connection을 확보 할 수 있다고 말한다.
(특히, connection 유지 비용이 줄어들면서 디바이스간 양방향 통신도 가능해짐)
추가로 CPU의 사용률은 낮아지지만 처리량은 늘었다는 것을 확인 할 수 있었다고 한다.
(즉, asynchronous를 통해 요청에 대한 처리량이 늘었음)
'IT > AWS' 카테고리의 다른 글
[Netflix] Part 5 - API 배포 준비 (0) | 2018.12.22 |
---|---|
Circuit Breaker 패턴 (0) | 2018.12.20 |
[Netflix] Part 4 - Fault Tolerance (0) | 2018.12.19 |
[Netflix] Part 3 - Resilient API (0) | 2018.12.18 |
[Netflix] Part 1 - Zuul 소개 (0) | 2018.12.04 |
댓글