pile·
백엔드·vercel-blogVercel Blog·

Vercel 함수 스트리밍, 프레임워크 무관 기본 기능으로 전환

Vercel이 Node.js Functions의 HTTP 응답을 버퍼링에서 스트리밍으로 전환한다. 이 변경은 AI 스트리밍 응답부터 실시간 로그까지 개발 경험 전반에 영향을 미치며, 스트리밍 중 오류 발생 시 동작 방식이 버퍼링과 근본적으로 달라진다는 점을 이해해야 한다.

핵심 포인트
  • 스트리밍에서는 응답 헤더(상태 코드)가 먼저 전송된 뒤 오류가 발생하면 상태 코드를 500으로 바꿀 수 없다
  • 기존 버퍼링에서는 함수 실행 완료 후 로그가 한 줄로 압축(4KB 제한)됐지만, 스트리밍에서는 각 로그가 개별 줄로 실시간 출력된다
  • VERCEL_FORCE_NODEJS_STREAMING=true 환경변수로 즉시 스트리밍 활성화 가능
  • Hobby 계정은 2024년 7월 8일, Pro/Enterprise는 10월 1일부터 기본 적용된다
  • Log Drain 프로바이더는 증가된 스트리밍 빈도를 지원하도록 업데이트해야 한다
상세 정리
  • 변경 배경: AI 스트리밍 응답 등 실시간 데이터 전송 수요 증가로 Node.js Functions의 기본값을 스트리밍으로 전환.
  • 스트리밍 vs 버퍼링 차이: 버퍼링은 함수 완료 후 전체 응답을 전송하지만, 스트리밍은 청크 단위로 즉시 클라이언트에 전달.
  • 오류 처리 핵심 변화: res.writeHead(200)으로 헤더를 보낸 뒤 throw Error가 발생하면 상태 코드를 바꿀 수 없다. 클라이언트는 200 상태에 불완전한 바디를 받게 됨.
  • 코드 예시: res.write로 청크를 전송하다 중간에 예외가 발생하면 이미 전송된 200 헤더는 변경 불가 — 기존 버퍼링의 500 에러 반환과 다른 동작.
  • 로그 개선: 스트리밍 전환으로 각 console.log 호출이 정확한 타임스탬프와 함께 실시간 개별 줄로 출력됨. 디버깅 편의성 대폭 향상.
  • Log Drain 영향: 스트리밍 빈도 증가로 Log Drain 프로바이더도 고빈도 스트림을 지원하도록 업데이트 필요.
  • 조기 활성화: VERCEL_FORCE_NODEJS_STREAMING=true 환경변수로 출시 전에 미리 테스트 가능.
왜 읽나Vercel에서 Node.js Functions를 운영하는 백엔드·풀스택 엔지니어가 스트리밍 전환의 오류 처리 패턴 변화를 사전에 파악하고 준비하기 위해.
vercel-blog
Vercel Blog 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·github-engGitHub Engineering·

    조기 종료를 없애야 벡터화된다 — 메모리 속도 소스 코드 케이스 폴딩

    GitHub의 코드 검색 엔진 Blackbird는 480TB 이상의 소스 코드를 인덱싱하기 전 모든 바이트에 case folding을 적용한다. 이 글은 Rust로 구현한 case folding을 메모리 대역폭 한계(45+ GiB/s)까지 끌어올린 두 가지 반직관적 최적화를 상세히 다룬다. 핵심은 루프 조기 종료(break) 제거로 LLVM 벡터화를 유도하고, UTF-8을 디코딩하지 않고 바이트 공간 산술만으로 fold를 수행하는 것이다.

    #rust#unicode#simd+2
  2. 백엔드·여기어때 (GC컴퍼니)여기어때 (GC컴퍼니)·

    트랜잭션 스크립트에서 숙소 메타 + 가격 계산 모듈로 — 전시 아키텍처 개선기 (2/3)

    여기어때 전시개발팀이 숙소 상세(PDP) API를 해부한 결과, 코드상으로는 DB 호출 3번처럼 보이던 요청이 실제로는 MongoDB $lookup 체인으로 컬렉션을 19회 접근하는 구조였다. 이 트랜잭션 스크립트 방식의 핵심 문제는 "aggregation이 I/O를 가린다"는 점으로, 독립적인 쿼리 10개가 단일 파이프라인에 직렬화되어 병렬화 기회를 잃고, 가격 때문에 거의 안 바뀌는 이미지까지 매 요청마다 읽어야 하는 읽기 증폭이 발생했다. V3에서는 "조회 시점 조립"을 "쓰기 시점 사전 조립"으로 전환하고, 화면별로 복제되던 가격 계산 로직을 goodsprice 단일 모듈로 수렴했다. 4개 API(PLP/PDP/RDP/ILP)의 반복 마이그레이션은 Claude Code skill로 절차를 고정하고 쉐도잉 + 동일성 검증으로 안전망을 마련하는 방식으로 진행됐다.

    #architecture#migration#caching+2