effidevFlutter · Cloudflare-Edge · Cloud-Kostenoptimierung
Deutsch

Cloudflare Workflows Praxishandbuch: Fehlertolerante Serverless-Pipeline auf Durable Objects Basis

Cloudflare Workflows Durable Objects Fault Tolerant Retry Pipeline

Cloudflare Workflows Praxishandbuch: Ausfallsichere Pipelines ohne Zeitlimits

Klassische Serverless-Umgebungen (AWS Lambda, Cloudflare Workers) gelitten historisch unter kurzen Ausführungs-Timeouts und fehlender Zustandsspeicherung. Für mehrstufige Prozesse wie KI-Verarbeitung oder Medienkonvertierung mussten bisher externe Warteschlangen und Datenbanken kombiniert werden.

Cloudflare Workflows löst dieses Problem durch eine Durable Execution Engine, die auf Durable Objects aufbaut. Tritt in einem Schritt ein Fehler auf, bleibt der Zustand erfolgreich absolvierter Schritte im persistenten Speicher erhalten und die Pipeline startet exakt am fehlgeschlagenen Schritt neu.

Dieser Leitfaden erklärt die Funktionsweise von Cloudflare Workflows, die Nutzung von step.do / step.sleep und zeigt eine komplette KI-Verarbeitungspipeline.


1. Klassisches Serverless vs. Cloudflare Workflows

Kriterium Klassische Workers / Lambda Cloudflare Workflows (Durable Execution)
Max. Ausführungszeit Begrenzt (ca. 30 Sekunden) Unbegrenzt (Tage durch step.sleep möglich)
Wiederholung bei Fehlern Gesamte Funktion startet neu Automatische Wiederholungen nur für den defekten step
Zustandsspeicherung Manuelles Speichern in Redis/D1 Automatische Checkpoints pro Schritt via Durable Objects
Kostenmodell Abrechnung auch während der Wartezeit $0 CPU-Kosten während step.sleep

2. Das Workflows Programmiermodell

Cloudflare Workflows werden als TypeScript-Klassen definiert, die von WorkflowEntrypoint erben.

3 Zentrale API-Methoden

  1. step.do(name, config, callback): Der primäre Ausführungsschritt. Ergebnisse werden automatisch in Durable Storage gespeichert.
  2. step.sleep(name, duration): Pausiert den Ablauf ohne CPU-Kosten für eine definierte Dauer (Sekunden, Stunden, Tage).
  3. step.sleepUntil(name, timestamp): Halten Sie den Workflow bis zu einem exakten Zeitpunkt an.

3. Praxisbeispiel: KI-Pipeline mit automatischem Retry

Ein vollständiger Workflow zur KI-Zusammenfassung mit automatischen Re-Try-Versuchen und benachrichtigendem E-Mail-Versand:

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;

    // Schritt 1: KI-Zusammenfassung (Automatisch gespeichert)
    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: `Fasse diesen Text in 3 Punkten zusammen: ${rawText}`,
      });
      return aiResponse.summary;
    });

    // Schritt 2: Webhook mit exponentiellem Retry
    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();
      }
    );

    // Schritt 3: Kostenlose Wartezeit ($0 CPU-Kosten)
    await step.sleep('wait-before-email', '10 seconds');

    // Schritt 4: E-Mail-Versand
    await step.do('send-email', async () => {
      console.log(`E-Mail versendet an [${userEmail}]: ${summary}`);
      return { status: 'sent', sentAt: new Date().toISOString() };
    });
  }
}

4. Fazit

  1. Cloudflare Workflows eliminiert Ausführungs-Timeouts durch die native Zustandsspeicherung in Durable Objects.
  2. Schrittweise Checkpoints garantieren die Fortsetzung direkt ab dem fehlgeschlagenen step.do.
  3. Bietet eine im Vergleich zu AWS Step Functions erheblich einfachere Developer Experience.