서버리스 (Serverless)

"Focus on your code, not your servers"

— 서버 관리의 짐을 전적으로 퍼블릭 클라우드에 떠넘기자는 서버리스 진영의 영원한 가치 제안.

트래픽이 0일 때는 한 푼도 안 내지만, 호출이 급증하면 지갑이 실시간으로 탈탈 털릴 수 있는 양날의 검. 또한 수 수밀리초짜리 함수 실행을 위해 수 초 동안 대기하게 만드는 '콜드 스타트(Cold Start)'라는 극악의 렉을 안고 있다.(...)

1. 개요

서버리스는 개발자가 서버 인프라를 프로비저닝, 관리, 스케일링할 필요 없이 애플리케이션 코드를 실행할 수 있게 해주는 클라우드 컴퓨팅 모델이다. 이름만 들으면 '서버가 없는(Server-less)' 초자연적인 마법 같지만, 실제로는 남의 서버(주로 AWS 등 클라우드 제공업체)를 빌려 쓰는 것이다. 사용자는 서버 인스턴스를 통째로 켜두는 대신, 특정 이벤트가 발생할 때만 특정 함수를 깨워서 실행하는 FaaS (Function as a Service) 형태로 코드를 구동한다.(...)

2. 서버리스의 핵심 이점과 비용 효율성

서버리스 아키텍처는 기존 가상 서버(VM)나 도커 컨테이너 기반 환경과 비교했을 때 획기적인 장점들을 제공한다.

2.1. 무한에 가까운 자동 확장 (Auto Scaling)

  • 트래픽이 1개 들어오면 1개의 함수 컨테이너가 켜지고, 갑자기 10,000개가 몰리면 클라우드가 알아서 10,000개의 컨테이너를 즉시 생성하여 요청을 병렬로 처리한다. 개발자가 로드 밸런싱이나 오토스케일링 그룹 설정을 하느라 밤을 새울 필요가 없다.

2.2. 합리적인 Pay-per-use 요금제

  • 전통적인 가상 서버는 사용자가 단 한 명도 오지 않는 새벽에도 고정 월세를 내야 하지만, 서버리스는 오직 코드가 실행된 시간(밀리초 단위)과 호출 횟수에 비례해서만 과금된다. 즉, 트래픽이 완전히 제로(0)가 되면 비용도 완벽하게 0원이 된다.1

3. 빛이 강하면 그림자도 깊다: 치명적인 단점들

이렇게 은혜로운 서버리스 패러다임에도 실무자들을 미치게 만드는 단점들이 존재한다.

3.1. 콜드 스타트 (Cold Start) 딜레마

  • 오랫동안 호출이 없던 함수를 호출하면, 클라우드 시스템 내부에서 새 컨테이너를 올리고, 런타임(자바노드 등)을 띄우고, 내 코드를 로드하느라 첫 실행 시 몇 초 단위의 엄청난 지연(Latency)이 발생한다. 이를 콜드 스타트라고 부르며, 실시간성이 중요한 서비스에서 뜬금없는 프리징 현상을 유발하는 주범이다.2

3.2. DB 커넥션 풀(Connection Pool)의 고갈

  • 보통 웹 서버는 데이터베이스와 커넥션을 맺고 이를 재사용(Pooling)한다. 하지만 서버리스는 요청마다 새로운 임시 컨테이너가 생성되었다가 소멸하므로, 동시에 1,000개의 함수가 켜지면 데이터베이스에 1,000개의 커넥션이 무지성으로 연결되어 DB가 비명을 지르며 뻗어버릴 수 있다. 이를 방지하기 위해 별도의 커넥션 프록시(예: AWS RDS Proxy)를 중간에 두어야 하는 보일러플레이트가 추가된다.

4. 관련 밈 및 드립

4.1. There is no Serverless, it's just someone else's computer

서버리스의 본질을 꿰뚫는 개발자 서브컬처 최고의 유행어다. 클라우드 벤더사들이 마치 물리적 서버가 완전히 증발한 것처럼 화려하게 마케팅하지만, 결국 백엔드에서는 아파치 헬기가 포탄을 날리듯 타인의 데이터센터에서 수천 대의 컴퓨터가 뜨겁게 열기를 뿜으며 혹사당하고 있다는 사실을 자조하는 밈이다.

5. 여담

  • 웜 스타트(Warm Start) 꼼수: 콜드 스타트를 피하기 위해, 개발자들은 주기적으로(예: 5분마다) 더미(Dummy) 호출을 보내는 크론탭(Crontab)을 등록하여 강제로 컨테이너를 따뜻하게 유지(Warm State)시키는 웃픈 꼼수를 동원한다.
  • 람다의 15분 제약: 가장 대표적인 서버리스 서비스인 AWS Lambda는 함수 1회의 최대 실행 시간이 딱 15분으로 제한되어 있다. 만약 16분이 걸리는 무거운 데이터 배치 작업을 올렸다가는 15분이 되는 순간 피도 눈물도 없이 강제로 프로세스가 킬당한다.
  • 무서운 요금 폭탄: 무한 자동 확장이라는 말은, 내 코드에 무한 루프 버그가 생기거나 누군가 악의적으로 분당 수백만 번의 API 요청을 퍼부었을 때 클라우드가 그걸 전부 성실하게 실행해 주고 상상도 못 할 요금 청구서로 돌려준다는 뜻이기도 하다.

6. 관련 문서

각주

  1. 물론 이 점 때문에 토이 프로젝트나 MVP 제품을 초기에 저렴하게 론칭할 때 최고의 구원투수로 평가받는다.

  2. 특히 JVM 기반의 자바나 스프링 부트는 뚱뚱한 몸집 때문에 콜드 스타트가 심각하게 길어, 서버리스 환경에서 기피 대상 1호로 꼽힌다. 반면 가벼운 Go나 자바스크립트는 콜드 스타트가 매우 짧아 서버리스의 총아로 등극했다.