본문으로 바로가기
리옵트 핸드북
리옵트 핸드북
Vercel 엔터프라이즈 AI 플랫폼

플랫폼 기초

플랫폼 아키텍처AI SDK 런타임AI Gateway 제어면

실행 런타임

Workflow 장기 실행Sandbox 실행 격리MCP 데이터 계층Queues & 비동기 작업 관리

프롬프트 & 품질

프롬프트 엔지니어링 & 가드레일RAG & 검색 증강 생성관측성·평가

운영 체계

보안·거버넌스비용·안정성배포 전략 & AI CI/CD

실전 시나리오

고객지원 에이전트 아키텍처내부 리서치 에이전트 아키텍처승인형 백오피스 자동화코딩 오케스트레이션

오케스트레이션 패턴

그래프 중심 오케스트레이션실무 오케스트레이션 플레이북멀티 에이전트 아키텍처

부록

마이그레이션 가이드레퍼런스검증 리포트업데이트 내역
핸드북›Vercel 엔터프라이즈 AI›Queues & 비동기 작업 관리
한국어English

Queues & 비동기 작업 관리

Vercel Queues를 활용해 AI 작업의 fan-out, 배치 처리, 재시도·poison message 운영을 설계하는 방법을 정리합니다.

핵심 요약

  • 짧은 비동기 작업의 분산·속도 제한·재시도는 Queues, 상태 머신과 장기 실행·승인 대기는 Workflow로 분리합니다.
  • 사람 승인·외부 이벤트 대기는 Workflow의 강점이고, 단순 fan-out과 concurrency 제한·만료는 Queues에 내장돼 있습니다.
  • fan-out embedding·batch classification·notification dispatch·rate-limited API call이 대표적 Queues 패턴입니다.
  • poison message는 재시도 3회·exponential backoff를 기본으로 두고 자동 재처리는 비용 폭발 위험 때문에 수동 트리거로 둡니다.
  • Workflow step 안에서 Queues로 fan-out하는 조합이 대규모 AI 파이프라인의 기본 패턴이며, Queue 작업에도 비용 태그를 붙입니다.

Workflow가 상태 머신과 장기 실행을 맡는다면, Queues는 짧은 비동기 작업의 분산과 속도 조절을 맡습니다. 둘을 헷갈리면 간단한 fan-out에 Workflow를 쓰거나 승인 대기 작업을 Queue에 넣는 실수가 나옵니다.

Workflow vs Queues 선택 기준

질문WorkflowQueues
사람 승인이나 외부 이벤트 대기가 있나강점별도 구현
단순 fan-out 비동기 처리인가가능더 단순
실행 경로를 단계별로 감사해야 하나강점제한적
작업 하나가 10초 이내인가가능적합
concurrency 제한이 필요한가수동내장
재시도/만료가 주된 관심사인가가능내장

실행 구조

AI 작업에서 Queues를 쓰는 패턴

패턴설명예시
Fan-out embedding대량 문서를 청크 단위로 분산 임베딩RAG 인덱스 구축
Batch classification다수 항목을 분류/태깅티켓 대량 분류
Notification dispatchAI 결과를 다채널로 전달Slack + Email + CRM 동시 발송
Rate-limited API call외부 API 호출을 속도 제한 내에서 처리CRM 대량 업데이트
Scheduled chunk workcron 결과를 작은 단위로 분할 처리주간 보고서 데이터 수집

최소 구현 스켈레톤

import { handleCallback, send } from '@vercel/queue'

export async function enqueueDocument(docId: string, chunks: string[]) {
  await Promise.all(
    chunks.map((chunk, i) =>
      send(
        'embedding-jobs',
        { chunk, docId: `${docId}#${i}` },
        { idempotencyKey: `${docId}#${i}` }
      )
    )
  )
}

export const POST = handleCallback(
  async (job) => {
    const embedding = await generateEmbedding(job.chunk)
    await upsertVector({ docId: job.docId, chunk: job.chunk, embedding })
  },
  {
    visibilityTimeoutSeconds: 600,
    retry: (_error, metadata) => {
      if (metadata.deliveryCount > 5) return { acknowledge: true }
      return { afterSeconds: Math.min(300, 2 ** metadata.deliveryCount * 5) }
    },
  }
)
{
  "functions": {
    "app/api/queues/embed/route.ts": {
      "experimentalTriggers": [{ "type": "queue/v2beta", "topic": "embedding-jobs" }]
    }
  }
}

Queues + Workflow 조합 패턴

전체 오케스트레이션은 Workflow가 관리하고 특정 step에서 Queues로 fan-out하는 조합이 가장 효과적입니다.

import { send } from '@vercel/queue'
import { sleep } from 'workflow'

export async function batchAnalysisWorkflow(batchId: string) {
  'use workflow'

  const data = await collectData(batchId)
  const chunks = await splitIntoChunks(data)

  // Queues로 fan-out
  await enqueueProcessingChunks(batchId, chunks)

  // 완료 대기 방식은 별도 status store나 webhook/hook으로 구현합니다.
  await sleep('1h')

  return aggregateResults(batchId)
}

async function enqueueProcessingChunks(batchId: string, chunks: string[]) {
  'use step'

  await Promise.all(
    chunks.map((chunk, index) =>
      send(
        'processing-jobs',
        { batchId, chunk, index },
        { idempotencyKey: `${batchId}:${index}` }
      )
    )
  )
}

Poison message 운영 전략

항목권장 기본값이유
재시도 횟수3회AI 호출 비용과 안정성 균형
재시도 간격exponential backoffprovider rate limit 대응
메시지 보존60초~24시간 범위Vercel Queues retention 제한
실패 알림Slack 또는 대시보드누적 방지
재처리수동 트리거 기본자동 재처리는 비용 폭발 가능

concurrency 설계

작업 유형권장 concurrency이유
임베딩 생성10~50API rate limit에 맞춤
분류/태깅20~100가벼운 모델 호출
외부 API 쓰기5~10외부 시스템 부하 제한
Sandbox 실행3~5리소스 집약적

실무 해석

Queues는 "빠르게 많이" 처리하는 도구가 아니라 "안전하게 분산" 처리하는 도구입니다. concurrency를 높이면 throughput은 올라가지만 외부 API rate limit이나 비용 폭발을 먼저 따져야 합니다.

비용 태깅

Queue 작업도 Gateway를 호출할 때 user/tag 기반 reporting metadata를 반드시 붙입니다.

import { embed } from 'ai'

export const POST = handleCallback(async (job) => {
  const { embedding } = await embed({
    model: 'openai/text-embedding-3-small',
    value: job.chunk,
    providerOptions: {
      gateway: {
        tags: ['queue:embedding', `batch:${job.batchId}`],
      },
    },
  })
  // ...
})

ADR 스타일 결론

Decision

짧은 비동기 작업의 분산, 속도 제한, 재시도는 Queues로 처리하고, 상태 머신과 장기 실행은 Workflow로 분리합니다. Workflow step 안에서 Queues로 fan-out하는 조합이 대규모 AI 파이프라인의 기본 패턴입니다.

실무 체크리스트

  • 단순 fan-out을 Workflow로 과설계하지 않았는가
  • concurrency가 외부 API rate limit 이내인가
  • poison message 알림과 재처리 기준이 정해져 있는가
  • Queue 작업에 비용 태그(feature, batch id, tenant)가 붙어 있는가

관련 문서

  • Queues Docs
  • Workflow Docs
  • AI Gateway Overview

관련 문서

검증 리포트

링크, 최신성, 추론 구간, 소스 간 충돌 여부를 점검한 결과를 기록합니다.

업데이트 내역

이 핸드북의 변경 이력과 반영 근거를 기록합니다.

MCP 데이터 계층

MCP를 사용해 사내 시스템과 AI를 연결할 때 tools, resources, prompts의 경계를 어떻게 나눌지 정리합니다.

프롬프트 엔지니어링 & 가드레일

엔터프라이즈 AI 제품의 프롬프트 설계, 버전 관리, 입출력 가드레일, 안전성 통제를 정리합니다.

On this page

Workflow vs Queues 선택 기준실행 구조AI 작업에서 Queues를 쓰는 패턴최소 구현 스켈레톤Queues + Workflow 조합 패턴Poison message 운영 전략concurrency 설계비용 태깅ADR 스타일 결론실무 체크리스트관련 문서