[Network] 트래픽
들어가며.
개발을 하면서 트래픽이라는 단어를 들어봤을 것이다.
실제로 프로젝트를 진행하면서 트래픽을 어떤식으로 처리 할 것인지 고민하게 되었다.
이번 글은 트래픽에 대한 개념과 어떤 방법으로 트래픽을 처리하는 것인지 정리 해보는 글이다.
트래픽(Traffic).
사전적인 의미는 교통량을 의미하며 경유하는 양 이다.
웹에서는 방문한 사람들의 "데이터를 주고받는 양"을 의미한다.
웹 트래픽 분석을 하는 데이터로는
- 방문자 수
- 방문자 당 페이지 뷰 평균 수
- 평균 방문 시간
- 평균 페이지 뷰 시간
- 도메인 클래스
- 트래픽이 많은 시간대
- 요청을 가장 많이 받은 페이지
- 요청을 가장 많이 받은 엔트리(entry) 페이지
- 요청을 가장 많이 받은 출구(exit) 페이지
- 최상위 경로
- 참조자
를 분석하여 트래픽 그래프에 적용된다.
대용량 트래픽으로 발생하는 문제의 원인.
트래픽이 수용 할 수 있는 범위를 웃도는 양의 요청이 서버로 들어왔을 때 발생된다.
많은 사용자가 서버에 HTTP request를 요청한다.
request는 Queue를 통해 순서 대로 Thread pool 에 할당되게 되는데 Thread pool size 초과하는 요청은 큐에서 대기한다.
queue에 점점 request들이 쌓이게 되고 지속적으로 쌓이게 된다면 서버의 지연 시간은 기하급수적으로 증가하게 된다.
이 현상을 Thread pool hell 이라고 한다.
- 트래픽의 종류는 크게 세가지 정료로 나뉜다.
- Unicast : 일대일 통신
- Multicast : 일대다 통신 (송신기 1대-수신기 여러대)
- Broadcast : 일대 전부 통신(송신기 1대-수신기 전부)
- 트래픽은 Input 과 Output 의 상호작용이다. 동일한 Input 을 받더라도 Input 의 종류, 서버의 성능/개수, 처리코드 등에 따라 프로그램은 정상적으로 구동할 수도, 장애가 발생할 수도 있다.
I/O(Input-Output).
트래픽은 쉽게 말하면 Input 과 Output 을 주고받는 과정이다. I/O 는 진행 방식에 따라 크게 3가지 방식으로 나눌 수 있다.
- Blocking I/O
- Spring MVC와 RDBMS 가 채택하는 기본적인 방식
- Java 프로젝트 들이 Blocking 방식으로 설계가 되어 있다.
- input 할 때만다 새로운 Thread 가 할당되므로 속도의 저하를 체감 할 수 없다. 하지만 Thread pool size를 넘는 경우라면 성능이 급격하게 저하 된다.
- Synchronous Non-Blocking I/O
- Reqeust 이후 바로 Return 되고 다른 작업을 수행하면서 Response 를 처리한다.
- Response 의 주기적 체크 방식을 polling 이라 한다.
- 완료되기 전까지 지속적으로 호출하는 리소스를 사용해야 하므로 시스템 효율성이 떨어질 수 있다.
- Asynchronous Non-Bolocking I/O
- Request 이후 즉시 Response 된다.
- Polling 방식과 다르게 Response 이벤트가 발생하거나 미리 등록해 놓은 Callback 을 통해 작업을 완료하므로 I/O 과정에 불필요한 대기 시간과 리소스 사용을 줄일 수 있다.
마무리.
트래픽에 관한 내용을 정리하면서 대량의 트래픽을 관리하기 위해선 I/O 를 관리하여 해결 해야된다는 것을 알게되었다.
다음은 실제 프로젝트에 대량의 트래픽이 발생 했을 시나리오를 만들고 최적화 하는 해결과정을 해보려 한다.
실제로 적용하는 과정을 고민하고 해결하며 더욱 내용을 숙지 해보려 한다.
참고
https://ko.wikipedia.org/wiki/%EC%9B%B9_%ED%8A%B8%EB%9E%98%ED%94%BD
https://www.nextree.io/seupeuring-daeyongryang-teuraepig-ceori/