Cloudflare Workflows 실전 가이드: Durable Objects 기반의 서버리스 내결함성 재시도 파이프라인

Cloudflare Workflows 실전 가이드: 타임아웃 없는 서버리스 내결함성 파이프라인
기존 서버리스 환경(AWS Lambda, Cloudflare Workers)의 가장 큰 약점은 **단기 실행 타임아웃(Short Execution Timeouts)**과 상태 보존(State Persistence)의 미비였습니다. 외부 API 호출 지연, 대용량 파일 변환, AI 이미지/텍스트 생성 파이프라인 등 몇 분 이상 소요되는 작업을 처리하려면 큐(Queue)와 DB, 람다 함수를 복잡하게 엮어야 했습니다.
Cloudflare가 출시한 **Cloudflare Workflows**는 Durable Objects의 영속적 상태 저장 아키텍처를 기반으로 한 **내결함성 워크플로우 엔진(Durable Execution Engine)**입니다. 코드 중간에 에러가 발생하거나 서버가 재시작되어도, 완료된 스텝의 상태가 자동 보존되어 미완료 스텝부터 정확히 재실행(Retry)됩니다.
본 가이드에서는 Cloudflare Workflows의 작동 원리, step.do / step.sleep 활용법, 그리고 AI 배치 처리 파이프라인 구축 실전 코드를 소개합니다.
1. Traditional Serverless vs Cloudflare Workflows 비교
| 비교 항목 | 기존 Cloudflare Workers / Lambda | Cloudflare Workflows (Durable Execution) |
|---|---|---|
| 최대 실행 시간 | 수 초 ~ 30초 내외 제한 | 제한 없음 (step.sleep으로 며칠 대기 가능) |
| 장애 시 재시도 | 전체 함수 재실행 (중복 Side-effect 발생) | 실패한 특정 step만 지수 백오프 자동 재시도 |
| 상태 저장 방식 | 외부 DB(Redis, D1)에 매번 수동 직렬화 | Durable Objects 기반 각 Step 결과 자동 체크포인팅 |
| 비용 모델 | 대기 시간(Sleep) 동안 CPU 타임 과금 | step.sleep 동안 CPU 타임 과금 $0 (무료 대기) |
2. Workflows 핵심 프로그래밍 모델
Cloudflare Workflows는 TypeScript 클래스로 정의하며 WorkflowEntrypoint를 상속받습니다.
3대 핵심 API
step.do(name, config, callback): 독립적으로 상태가 체크포인팅되는 최소 작업 단위입니다. 해당 블록이 성공하면 결과가 Durable Storage에 자동 저장됩니다.step.sleep(name, duration): 비동기 프로세스를 지정한 시간(초, 분, 일) 동안 정지시킵니다. 대기 기간 동안 CPU 코어를 소모하지 않습니다.step.sleepUntil(name, timestamp): 특정 시각까지 작업을 안전하게 대기시킵니다.
3. 실전 예제: AI 콘텐츠 생성 및 이메일 발송 파이프라인
다음은 AI 요약 생성 후 외부 API 재시도 처리, 10초 대기, 최종 발송까지 보장하는 내결함성 워크플로우 코드입니다.
import { WorkflowEntrypoint, WorkflowEvent, WorkflowStep } from 'cloudflare:workers';
type Env = {
AI: any;
MY_WORKFLOW: Workflow;
};
type Params = {
articleId: string;
userEmail: string;
rawText: string;
};
export class ArticleSummaryWorkflow extends WorkflowEntrypoint<Env, Params> {
async run(event: WorkflowEvent<Params>, step: WorkflowStep) {
const { articleId, userEmail, rawText } = event.payload;
// Step 1: AI 요약 생성 (자동 체크포인팅)
const summary = await step.do('generate-summary', async () => {
const aiResponse = await this.env.AI.run('@cf/meta/llama-3.3-70b-instruct-fp8-fast', {
prompt: `다음 글을 3줄 요약해줘: ${rawText}`,
});
return aiResponse.summary;
});
// Step 2: 외부 웹훅 전송 (실패 시 최대 3회 재시도 설정)
const webhookResult = await step.do(
'send-webhook',
{
retries: {
limit: 3,
delay: '5 seconds',
backoff: 'exponential',
},
timeout: '10 seconds',
},
async () => {
const res = await fetch('https://api.example.com/webhooks/summary', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ articleId, summary }),
});
if (!res.ok) throw new Error(`HTTP Error: ${res.status}`);
return await res.json();
}
);
// Step 3: 사용자 확인을 위한 10초 대기 (CPU 타임 과금 $0)
await step.sleep('wait-before-email', '10 seconds');
// Step 4: 최종 이메일 발송 완료
await step.do('send-email', async () => {
console.log(`이메일 발송 완료 [${userEmail}]: ${summary}`);
return { status: 'sent', sentAt: new Date().toISOString() };
});
}
}
Wrangler 설정 (wrangler.jsonc)
{
"name": "my-durable-pipeline",
"main": "src/index.ts",
"compatibility_date": "2026-07-30",
"workflows": [
{
"name": "article-summary-workflow",
"binding": "MY_WORKFLOW",
"class_name": "ArticleSummaryWorkflow"
}
]
}
4. 요약 및 핵심 이점
- **
Cloudflare Workflows**는 Durable Objects 기반으로 작동하므로 백엔드 타임아웃 걱정 없이 긴 배치 작업을 처리할 수 있습니다. - 각 **
step.do**의 결과가 자동 저장되어 중간 장애 시에도 이전 스텝을 재실행하지 않고 실패 스텝부터 즉시 재개합니다. - AWS Step Functions 대비 훨씬 단순한 TypeScript 코드 정의와 뛰어난 비용 효율성을 제공합니다.