Guía Práctica de Cloudflare Workflows: Pipeline Servidor Sin Fallos Basado en Durable Objects

Guía Práctica de Cloudflare Workflows: Pipelines Sin Tiempos de Espera
El principal inconveniente de los entornos serverless tradicionales (AWS Lambda, Cloudflare Workers) ha sido siempre el tiempo máximo de ejecución limitado y la ausencia de estado persistente. Coordinar tareas de larga duración, como procesamientos en lote o integración de APIs de IA, requería conectar múltiples colas y bases de datos.
Cloudflare Workflows resuelve este problema mediante un motor de ejecución duradera (Durable Execution) fundamentado en Durable Objects. Incluso si un paso intermedio falla o un nodo de borde se reinicia, los pasos completados se guardan automáticamente en almacenamiento persistente.
En esta guía analizamos la arquitectura de Cloudflare Workflows, las funciones step.do y step.sleep, y la implementación de un pipeline con reintentos automáticos.
1. Serverless Tradicional vs Cloudflare Workflows
| Característica | Workers / Lambda Tradicionales | Cloudflare Workflows (Durable Execution) |
|---|---|---|
| Tiempo Máximo de Ejecución | Limitado (30 segundos) | Sin límite (Días de espera con step.sleep) |
| Reintentos tras Fallo | Reejecuta la función completa | Reintentos automáticos solo para el step fallido |
| Persistencia de Estado | Guardado manual en Redis o D1 | Checkpoints automáticos por paso en Durable Objects |
| Modelo de Coste | Facturación durante esperas pasivas | Coste de CPU de $0 durante step.sleep |
2. Modelo de Programación de Workflows
Cloudflare Workflows se define como una clase TypeScript que extiende de WorkflowEntrypoint.
3 APIs Fundamentales
step.do(name, config, callback): Unidad básica de ejecución. El resultado devuelto se guarda automáticamente en almacenamiento persistente.step.sleep(name, duration): Pausa la ejecución durante el tiempo indicado sin consumir tiempo de CPU.step.sleepUntil(name, timestamp): Suspende la ejecución hasta una marca de tiempo UTC concreta.
3. Ejemplo Práctico: Pipeline de IA con Reintentos
Código completo de un flujo de trabajo que genera resúmenes con IA, realiza reintentos con backoff exponencial y envía notificaciones:
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;
// Paso 1: Generación de Resumen con IA (Checkpointed)
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: `Resume el siguiente texto en 3 puntos: ${rawText}`,
});
return aiResponse.summary;
});
// Paso 2: Envío de Webhook con Reintentos Automáticos
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();
}
);
// Paso 3: Espera pasiva (Coste $0 de CPU)
await step.sleep('wait-before-email', '10 seconds');
// Paso 4: Envío Final de Correo
await step.do('send-email', async () => {
console.log(`Correo enviado a [${userEmail}]: ${summary}`);
return { status: 'sent', sentAt: new Date().toISOString() };
});
}
}
4. Conclusión
Cloudflare Workflowselimina los tiempos de espera serverless almacenando el estado de ejecución en Durable Objects.- Los checkpoints por paso garantizan la reanudación exacta tras un fallo imprevisto.
- Ofrece una experiencia de desarrollo mucho más simple y económica que AWS Step Functions.