vercel은 서버리스 방식으로 cold start가 있어 EC2에 비해 5배 정도 느리다.
이 말을 확인해 보기 위해 같은 Next.js 프로젝트를 EC2와 Vercel에 각각 배포해 봤다.
이번 글에서는 각각의 차이에 대해서 알아보겠다.
같은 프로젝트를 Vercel과 EC2에 배포해서 비교
왼쪽은 Vercel에 오른쪽은 EC2에 배포했다.
배포하고 나면 눈으로 봐도 큰 차이가 느껴질 줄 알았는데 아니었다. 비슷했다!
DOMContentLoaded랑 Load 시간을 비교해 보면 되나? 했는데 이건 cold start랑 관련이 없다.
DOMContentLoaded는 HTML 문서가 로드된 시간, Load는 페이지와 관련된 모든 리소스가 로드되었을 때 시간을 나타내기 때문이다.
network탭의 timing에 있는 Waiting for server response가 차이가 있을 거 같으나 수면 상태로 전환되지 않아 Cold Start는 확인하지 못했다...
Cold Start는 뭐고 왜 Vercel은 서버리스 방식으로 더 느릴 수 있다는 걸까?
일단 서버리스에 대해서 알아보자!
서버리스
서버가 없다는 것이 아니라 개발자가 서버를 관리할 필요 없이 애플리케이션을 빌드하고 실행할 수 있게 해 준다.
24시간 내내 돌아가는 게 아니라 수면 상태에 있다가 요청이 들어오면 잠들어 있는 함수를 깨우고 실행시켜 요청한 작업을 수행하게 한다.
장점
- 서버에 신경 쓸 필요가 줄어 애플리케이션 품질에 집중할 수 있다.
- 배포가 간편하다.
- 요청이 들어올 때만 실행하고 동적으로 자원을 할당해 가용성이 높고 스케일링에 신경 쓸 필요가 없다.
- 이벤트 기반의 비용으로 일정주기, 조건 등에 함수를 호출하므로 리소스를 낭비하지 않게 되어 비용이 저렴하다. (실제 사용량을 기반으로 비용 청구)
단점
- Cold Start로 수면 상태에서 요청을 하면 응답까지 지연이 있다.
- 함수가 1회 호출될 때 사용할 수 있는 메모리 및 시간에 제한이 있다.
- 커스텀에 한계가 있다.
내가 찾던 Cold Start는 서버리스의 단점이었다.
Cold Start
한동안 사용되지 않아 수면 상태에 있던 서버가 다시 활성화되어야 할 때 발생한다. 이때 서버를 다시 시작하는 과정에서 필요한 리소스를 로드하고 환경을 구성하는데 시간이 소요되어 사용자는 평소보다 느린 응답을 경험하게 된다. 이런 초기 지연 현상을 Cold Start라고 한다.
비교 결과
Vercel은 서버리스 방식으로 수면 상태에 있던 서비스를 요청을 했을 때 다시 활성화되기까지의 Cold Start(초기 지연현상)를 경험할 수 있다. 반면, EC2는 인스턴스가 시작된 후 계속해서(24시간 내내) 실행되기 때문에 Cold Start 문제가 발생하지 않는다!
초기 지연 현상이 눈에 띄게 있다면, EC2나 다른 대안에 배포를 고려하거나 공식문서에 cold start를 개선하는 방법을 참고하면 될 거 같다.
뭐가 더 좋다!!라는 건 없고 프로젝트 상황에 맞게 장단점을 따져 서버리스와 EC2(전통적인 서버기반)등... 중에 고르면 될 거 같다.
+ 서버리스 등장 배경
온프레미스(On-premise)
하드웨어와 소프트웨어를 직접 설치하고 관리해야 하므로 번거롭다는 단점이 있어 이를 해소하기 위해 클라우드가 등장했다.
클라우드(IaaS/PaaS)
예를 들어, AWS EC2 같은 서비스로 돈만 내면 아마존에서 최신식 서버를 빌려서 사용할 수 있게 되었다.
- IaaS(Infrastructure as a Service)
사용자가 필요에 따라 인프라를 임대할 수 있게 해주는 서비스이다. 개발자가 직접 인프라를 설정하고 관리할 수 있다.
AWS EC2, Google Compute Engine, Microsoft Azure VMs 등 - PaaS(Platform as a Service)
애플리케이션 개발과 배포에 필요한 플랫폼과 환경을 제공하는 서비스이다. 개발자는 코드에 집중하고 인프라는 클라우드 제공업체가 관리한다.
Microsoft Auzure App Services, Heroku 등
하지만 여전히 서버의 소프트웨어 부분은 개발자가 직접 관리해야 한다. (운영체제 업데이트, 데이터 백업, 보안 등)
On-demand(쓴 만큼 지불하는) 서비스를 이용하더라도 대부분의 클라우드 서비스들은 사용자들이 내 서버를 사용하지 않더라고 그냥 가동만 시켜도 시간마다 결제가 되는 시스템이다. 이는 크던 작던 손실을 일으키고 이때 등장한 것이 서버리스이다.
서버리스(FaaS/BaaS)
필요한 컴퓨팅 리소스와 스토리지만 동적으로 할당한 다음 그 부분에 대해서만 비용을 청구하는 클라우드 실행 모델이다. 24시간 내내 돌아가는 게 아니라 휴면 상태에서 요청이 들어올 때만 실행되어 경제적이며 자원을 효율적으로 사용할 수 있다. 개발자는 스케일링, 업데이트, 보안 등 관리와 운영에 대해 시간을 소모하지 않고 개발에 집중할 수 있다.
- FaaS(Function as a Service)
서버에 수행할 기능들을 개발자가 직접 코드로 작성해 등록한다. 실행 가능한 코드(함수)를 미리 등록해 놓고 특정 이벤트가 발생하면 알아서 호출 및 종료되도록 한다.
AWS Lambda, Microsoft Azure Function, Google Cloud Functions 등 - BaaS(Backed as a Service)
SNS 연동이나 DB와 같이 백앤드에 필요한 기능들을 직접 구현할 필요 없이 제공하는 API로 해당 기능을 구현할 수 있게 해주는 것이다.
Firebase 등
다 쓴 글을 읽고 마지막으로 글을 수정하려고 했는데 졸려서 삭제를 눌러버렸다 ㅎㅎ😂
처음부터 다시 쓰고 자러 간다! (티스토리 글 삭제하면 며칠은 백업 가능하게 해 주세요ㅠㅠ)
굿나잇 🌙
'IT' 카테고리의 다른 글
AWS EC2에 Next.js 프로젝트 배포 (1) | 2024.06.07 |
---|---|
React Query (+custom hook으로 사용하기) (0) | 2024.01.15 |
react와 vue 비교(데이터 바인딩과 데이터 흐름) (0) | 2024.01.05 |
session과 jwt 기반 인증 방식 장단점 (0) | 2023.11.12 |
Storybook createPortal 관련 에러 (Error: Target container is not a DOM element.) (1) | 2023.11.02 |