전통적인 서버리스의 invocation 1:1 인스턴스 모델은 I/O 대기 중 CPU가 유휴 상태가 된다. Vercel은 단일 함수 인스턴스가 여러 요청을 동시에 처리하는 in-function concurrency를 공개 베타로 출시했다. Node.js의 비동기 특성을 활용해 20~50%의 컴퓨트 비용 절감을 달성하며, 구현에는 Rust 기반 런타임 재작성과 Streaming TCP 소켓이 핵심 역할을 했다.
핵심 포인트- 전통 서버리스의 1:1 모델은 API 응답 대기, 서버 렌더링, AI 호출 등 I/O 바운드 워크로드에서 CPU가 낭비된다
- 단일 함수 인스턴스가 여러 요청을 동시에 처리해 I/O 대기 유휴 시간에 다른 요청을 처리한다
- 구현 핵심: Streaming TCP 소켓(Lambda 제약 우회) + Rust 런타임 재작성 + 함수당 최대 100,000 인스턴스를 관리하는 로드 밸런서
- 20~50% 컴퓨트 비용 절감 기대. Verse는 10M 방문자 / 15,000 동시 사용자 환경에서 실제 50%+ 절감 달성
- CPU 바운드 워크로드에서는 레이턴시 증가가 발생할 수 있어 I/O 바운드 워크로드에 적합하다
상세 정리- 문제: 전통 서버리스(AWS Lambda 모델)는 invocation 하나에 인스턴스 하나를 대응시킨다. 100ms 요청(컴퓨트 50ms + I/O 대기 50ms) 두 개에 두 인스턴스가 필요하고 I/O 대기 중 CPU는 완전히 유휴 상태다
- 해결 원리: Node.js는 이벤트 루프 기반 비동기 I/O를 사용한다. 함수가 백엔드 응답을 기다리는 동안 같은 인스턴스에서 다른 요청을 처리하면 CPU 낭비를 없앨 수 있다
- Streaming TCP 소켓: Next.js 13의 스트리밍 지원(2022) 이후 Vercel이 개발. 함수와 invocation 서비스 간 양방향 통신을 가능하게 하고 Lambda의 스트리밍 제약을 우회한다
- Rust 런타임: 함수 런타임을 Rust로 재작성해 안정적인 오케스트레이션, 성능 향상, 디버깅 용이성을 확보했다
- 로드 밸런서: 트래픽이 함수 로드 밸런서 → invocation 서비스를 거치며 함수당 최대 100,000 인스턴스를 관리한다. 이미 in-flight 요청이 있는 인스턴스로 우선 라우팅한다
- 효율 예시: 100ms 요청(50ms 컴퓨트 + 50ms I/O 대기) 두 개에 기존엔 두 인스턴스가 필요했지만, concurrency로 하나의 인스턴스가 약 100ms에 모두 처리한다
- 실제 사례: Verse가 10M 방문자, 15,000 동시 사용자 환경에서 50%+ 컴퓨트 비용 절감을 달성했다
- CPU 바운드 주의: CPU를 지속 점유하는 워크로드는 다른 요청 처리 시 레이턴시 증가가 발생할 수 있다. DB 쿼리, API 호출, AI 스트리밍 등 I/O 바운드 워크로드에 최적이다
- 호환성: 기술적으로는 breaking change지만 opt-in 방식. 단일 Node.js 프로세스에서 여러 요청이 동시 실행되는 의미 변화에 주의가 필요하다
- 가용성: Pro/Enterprise 고객, 새로운 observability 대시보드에서 비용 절감/레이턴시/TTFB를 실시간 추적 가능하다
왜 읽나API 서버, SSR, AI 스트리밍 등 I/O 바운드 서버리스 워크로드의 비용 최적화를 고려 중인 백엔드/인프라 엔지니어에게 in-function concurrency의 기술 원리와 실제 비용 절감 사례를 제공한다.