대용량 트래픽 발생 시 어떻게 대응해야 하나요?
먼저 서버는 왜 터질까?
서버 = 외부로부터 들어오는 요청을 받아 처리해주고 응답을 주는 프로그램이 돌아가는 어떤 컴퓨터
서버 또한 처리속도와 한계가 CPU, 메모리, 저장장치에 영향을 받는다는 말
웹 서버라는 프로세스가 있다면, 그 프로세스 안에는 다수의 요청을 시분할 처리하기 위한 스레드들이 있다.
스레드가 아무리 많아도 결국 task를 처리하는건 cpu이기 때문에 처리속도에는 한계가 있다.
또한 모든 task를 동시에 처리할 수 없기떄문에 결국 task를 큐에 넣어 순차적으로 처리하게 되는데, 이 큐는 메모리에 존재한다. 즉, 요청을 들어오는 족족 큐에 넣다보면 메모리 오버플로우가 날 수 있다는 것이다.
웹 서버는 결국 프로그램인데 메모리 오버플로우가 난다면? 종료가 된다. 그렇게 웹 서버가 터지게 된다.
그리고 서버를 터지게 하는 원인에는 메모리 오버플로우 뿐 아니라 큐 오버플로우도 있다.
1. 서버의 수평적 확장하고 로드밸런싱을 추가해 트래픽을 분산한다.
2. 캐시를 적용해 반복적은 요청을 처리하는데 필요한 리소스를 줄일 수 있다. 또한 캐싱된 데이터를 사용하면 요청에 대한 응답 시간 또한 단축할 수 있다.
3. CDN(Content Delivery Network)를 사용해 콘텐츠를 여러 리전에 분산해 물리적인 거리를 줄여 데이터 요청에 대한 응답 속도를 향상 시킬 수 있다.
4. 인덱스를 추가하거나 쿼리를 최적화하여 데이터베이스를 최적화 한다.(데이터 처리 속도를 향상 시킨다.)
5. DNS 캐싱 서버를 사용해 DNS 조회 요청을 줄여 응답시간을 단축 시킬 수 있다.
6. 코드를 최적화 하여 실행 시간을 단축하면 처리할 수 있는 트래픽 양이 늘어날 수 있다.
+ 서버의 수직적 확장(CPU 추가, 램 추가, 서버 업그레이드 등), 네트워크 대역폭 늘리기
ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결해야할까?
1. native Query를 사용한다.
2. Stored Procedure(저장 프로시저)
DB에 대한 작업을 정리한 절차 자체를 RDBMS에 저장한 쿼리의 집합이다. 영구저장모듈이라고도 불림.
첫번째 실행으로 메모리에 실행 결과를 등록하고 이후 실행부터는 메모리에서 결과를 가져오기때문에, 성능면에서 유리하고 여러개의 쿼리를 한번에 실행 할 수 있기 때문에, 쿼리를 복잡하게 만들지 않을 수 있다.
하지만 이것도 장단점이 있기때문에 상황에 맞게 사용하는것이 중요
3. 쿼리 분리: 하나의 쿼리는 하나의 목적만을 가지게 한다.
4. 쿼리 최적화: 인덱스를 추가해 특정 데이터 검색 시 속도를 빠르게 한다.
5. QueryDSL(라이브러리) 복잡한 쿼리를 직관적으로 작성할 수 있다.
6. 프로파일링과 모니터링
MySQL에서 쿼리 프로파일링을 제공해, 쿼리가 처리되는 동안 각 단게별 작업에 시간이 얼마나 걸렸는지 확인할수있다.
좀 더 생각해 볼것
orm을 사용해야하는 경우/ 사용하지 않아도 되는 경우는 뭐가 있을까?
참고
https://velog.io/@yaaloo/%EB%8C%80%EA%B7%9C%EB%AA%A8-%ED%8A%B8%EB%9E%98%ED%94%BD-%EC%B2%98%EB%A6%AC
'기술면접' 카테고리의 다른 글
http, https / OSI 7계층 (0) | 2024.04.04 |
---|---|
JWT, 토큰인증, OAuth (0) | 2024.04.02 |
RDBMS 정규화, PK & FK (0) | 2024.03.29 |
HTTP 메서드 (0) | 2024.03.28 |
프로세스와 쓰레드 (0) | 2024.03.27 |