Menerapkan Saga Pattern untuk AI Agent di n8n: Transaksi Lintas API yang Konsisten + Rollback Otomatis
· 8 menit baca
Menerapkan Saga Pattern untuk AI Agent di n8n: Transaksi Lintas API yang Konsisten + Rollback Otomatis
Pernah ngalamin workflow automation di n8n berhenti di tengah karena satu API error, terus kamu bingung cara “balikin” efek step sebelumnya? Inilah masalah klasik transaksi terdistribusi. Solusinya bukan tambah retry, tapi mikir kayak sistem finansial: pakai Saga Pattern. Di artikel ini, kita bikin AI Agent + n8n automation yang mengeksekusi serangkaian aksi lintas API (Stripe/Supabase/LaunchDarkly/Postmark) dengan kompensasi otomatis kalau ada yang gagal. Ini bukan teori buku — ini desain yang bisa kamu jalanin hari ini buat bikin build SaaS cepat dengan AI tapi tetap andal.
Hook: Kenapa kamu butuh Saga Pattern di n8n?
- Workflow panjang kamu (billing → database → feature flag → email) sering partial success. Perbaikan manual makan waktu dan rawan salah.
- Retry membabi-buta bikin duplikasi (contoh: subscription double di Stripe), atau malah memperparah kondisi inkonsisten.
- AI Agent yang otonom makin sering ngetrigger banyak API sekaligus — tanpa guardrail transaksi, hasilnya chaos.
Saga Pattern memecah transaksi besar jadi rangkaian langkah independen plus compensating action untuk tiap langkah. Kalau langkah ke-3 gagal, langkah 1-2 dikompensasi mundur (rollback logis) biar sistem balik ke kondisi konsisten.
Konsep ringkas: Saga Pattern, Orchestrator, dan AI Agent
- Saga Pattern: urutan step yang masing-masing punya do dan compensate. Eksekusi maju; kalau gagal, jalankan kompensasi mundur.
- Orchestrator: workflow pusat di n8n yang menyimpan saga log, mengatur urutan, dan memanggil kompensasi.
- AI Agent: bukan pengganti kompensasi, tapi planner yang bantu pilih kebijakan (retry, skip, escalate) berdasarkan konteks dan policy. Dia juga bisa auto-generate draft kompensasi untuk API baru.
- Idempotensi: semua panggilan API penting harus bisa diulang tanpa efek ganda. Gunakan Idempotency-Key dan natural key (misal user_id) sebagai pegangan.
Desain Arsitektur: Saga Pattern di n8n
Gambaran komponen minimal:
- Workflow Orchestrator (n8n): menerima payload, membentuk daftar step saga, mengeksekusi, dan memanggil kompensasi jika perlu.
- Saga Log Store: Data Stores n8n atau Postgres eksternal. Simpan status step (pending/success/compensated), request/response, dan kunci idempotensi.
- AI Agent Node: model LLM yang menerima ringkasan status lalu merekomendasikan tindakan (retry vs compensate vs escalate).
- Observability: notifikasi Slack/Discord + metrik biaya LLM dan hit API.
Skema step (disarankan disimpan sebagai array JSON di input):
- name: “create_stripe_subscription”
- do: method, url, headers, body
- compensate: method, url, headers, body (mengacu ke output step do)
- idempotencyKey: string unik per transaksi
- retryPolicy: maxAttempts, backoff
Implementasi Node-by-Node: Saga Pattern untuk Upgrade Plan SaaS
Use case: user upgrade plan. Langkah bisnis:
- Buat/upgrade subscription di Stripe.
- Update role/plan di Supabase.
- Set feature flag di LaunchDarkly.
- Kirim email konfirmasi via Postmark.
Kalau langkah ke-3 gagal, kita rollback ke kondisi sebelum upgrade: revert role/plan dan batalkan/cancel proration di Stripe.
1) Entry: Webhook + Validasi
- Node: Webhook (POST /sagas/upgrade)
- Validasi input: user_id, email, target_plan, price_id
- Generate transaction_id dan idempotency_key (gabungan user_id + timestamp atau UUID)
2) Bangun Daftar Step Saga
- Node: Function
- Step A: create/update subscription di Stripe
- do: POST https://api.stripe.com/v1/subscriptions atau /v1/invoices/…
- headers: Authorization: Bearer STRIPE_KEY; Idempotency-Key: {{idempotency_key}}-stripe
- body minimal: customer, items[price], proration_behavior
- compensate: CANCEL subscription (POST /v1/subscriptions/{id} dengan cancel_at_period_end=true atau refund proration sesuai policy)
- Step B: update plan di Supabase
- do: PATCH https://.supabase.co/rest/v1/profiles { plan: target_plan }
- headers: apikey, Authorization: Bearer service_role
- compensate: PATCH plan kembali ke previous_plan
- Step C: set feature flag di LaunchDarkly
- do: PUT /api/v2/users/{env}/{userKey} atau PATCH flag target
- compensate: kembalikan value flag ke sebelumnya
- Step D: email konfirmasi (Postmark/SendGrid)
- do: POST /email dengan template upgrade sukses
- compensate: POST /email dengan template “upgrade dibatalkan, akun kembali seperti semula”
- Step A: create/update subscription di Stripe
3) Saga Orchestrator
- Node: Loop (Execute for each step)
- Node: HTTP Request (Do)
- Set idempotency header kalau tersedia.
- On success: tulis ke Saga Log Store status=success + payload yang dibutuhkan untuk kompensasi (misal subscription.id).
- On failure: lanjut ke AI Agent.
- Node: AI Agent (LLM)
- Input: ringkasan transaksi (step saat ini, error code, durasi, sisa langkah), policy bisnis (misal “jangan kirim email kalau billing gagal”).
- Output: action = retry|compensate|escalate, alasan, dan detail kompensasi mana yang harus dipanggil.
- Branching:
- Kalau retry: terapkan backoff; maksimal sesuai retryPolicy step.
- Kalau compensate: lompat ke fase kompensasi.
- Kalau escalate: kirim alert ke Slack + pause execution untuk approval manual.
- Node: HTTP Request (Do)
4) Kompensasi Mundur (Rollback)
- Node: Function untuk mengambil daftar step yang sudah sukses dari Saga Log Store (reverse order).
- Node: HTTP Request untuk setiap kompensasi (gunakan data dari log, misal subscription_id dari Stripe).
- Mark status tiap kompensasi: compensated/failed_compensation (kalau ini gagal, escalate).
5) Observability & Notifikasi
- Node: Slack/Discord untuk ringkasan: transaction_id, total durasi, biaya token LLM, outcome (success/compensated/partial).
- Optional: kirim event ke PostHog/BigQuery untuk metrik: success rate per step, top error code, rata-rata kompensasi.
Contoh Use Case Real: Upgrade Plan Stripe + Supabase + LaunchDarkly
Berikut potongan konfigurasi yang bisa langsung kamu terapkan (simplified, fokus ke struktur):
- Step A – Stripe
- Request: POST https://api.stripe.com/v1/subscriptions
- Headers: Authorization: Bearer STRIPE_KEY; Idempotency-Key: upgrade-{{transaction_id}}
- Body: customer={{stripe_customer_id}}, items[0][price]={{price_id}}, proration_behavior=create_prorations
- Compensate: POST /v1/subscriptions/{id} cancel_at_period_end=true atau refund invoice terakhir jika policy mengharuskan.
- Step B – Supabase
- Request: PATCH https://.supabase.co/rest/v1/profiles?user_id=eq.{{user_id}}
- Headers: apikey, Authorization: Bearer service_role
- Body: { plan: {{target_plan}}, previous_plan: {{current_plan}} }
- Compensate: PATCH field plan kembali ke {{current_plan}}
- Step C – LaunchDarkly
- Request: PATCH /api/v2/flags/{project}/{env}/{flag}
- ops: replace user target value ke true untuk fitur premium
- Compensate: balikkan value ke false atau ke snapshot sebelumnya.
- Request: PATCH /api/v2/flags/{project}/{env}/{flag}
- Step D – Postmark
- Request: POST /email/from-template (Template: PlanUpgradeSuccess)
- Compensate: POST /email/from-template (Template: PlanUpgradeReverted)
Aha moment: kamu nggak perlu lagi “if-else” bercabang ke mana-mana. Kamu cukup definisikan satu daftar step dengan do dan compensate, lalu Orchestrator yang urus alur maju dan mundurnya. AI Agent bantu memutuskan kapan harus retry vs rollback vs escalate — sesuai policy bisnis yang kamu tanamkan.
Saga Pattern + n8n: Praktik Penting Biar Tahan Produksi
- Idempotency semua API: Stripe mendukung Idempotency-Key; untuk API lain, gunakan natural key atau buat tabel outbox kamu sendiri untuk mencegah duplikasi. Simpan key di Saga Log Store.
- Compensation-first mindset: sebelum menulis step “do”, tulis dulu “compensate”. Kalau kompensasi belum jelas, jangan deploy step-nya.
- Atomic save log: setelah step sukses, simpan log + data kompensasi secara atomik. Di n8n, gunakan Data Store node atau HTTP ke Postgres API.
- Timeout & circuit breaker: AI Agent jangan bikin kamu over-retry. Tetapkan batas total waktu transaksi. Kalau lewat, escalate.
- Manual approval lane: untuk kompensasi berisiko tinggi (misal refund), tambahkan manual gate via Slack interaktif.
- Schema versioning: versi-kan struktur step dan kompensasi. Simpan version di log, supaya replay dan debugging konsisten.
- Testing “chaos”: buat mock upstream yang kadang return 500/429 untuk memaksa jalur kompensasi ditempuh. Pastikan semua jalan.
Breakdown Teknis: Cara Kerja Orchestrator di n8n
- Ingest: Webhook menerima input → validasi → generate transaction_id.
- Assemble: Function node bikin array steps (do+compensate) + policy.
- Persist: Insert saga header (transaction_id, status=pending) ke Saga Log Store.
- Execute: For each step → HTTP (Do) → on success save log → next step.
- Handle error: Kirim ringkasan ke AI Agent → dapatkan rekomendasi → apply (retry/compensate/escalate).
- Rollback: Jika compensate, ambil steps sukses → execute kompensasi reverse order → update log.
- Finalize: Update saga header ke success/compensated/failed → kirim notifikasi.
AI Agent sebagai “Compensation Planner”
Peran AI Agent yang tepat:
- Policy-aware: agent diberi system prompt berisi aturan bisnis (misal, “jangan pernah kirim email sukses kalau Stripe gagal”).
- Backoff strategist: menentukan jeda retry berdasarkan error code (429 pakai exponential backoff, 4xx tertentu langsung kompensasi).
- Template generator: saat ada integrasi API baru, agent menyarankan skeleton kompensasi berdasarkan dokumentasi API (kamu review sebelum production).
Kontraint: Jangan biarkan agent mengeksekusi kompensasi “baru” tanpa approval. Gunakan mode saran → review manual → commit ke repo “saga map”. Ini vibe coding yang aman: cepat iterasi dengan bantuan AI, tapi tetap ada pagar produksi.
Testing & Observability untuk Saga Pattern di n8n
- Shadow mode: jalankan orchestrator di mode simulasi (tidak menulis) untuk 10% trafik — hanya log rencana. Bandingkan outcome vs sistem manual.
- Replay: simpan request/response minimal (tanpa PII sensitif) untuk bisa replay dan bedah kasus gagal.
- Metrics:
- Success rate per step
- Average retries & time to compensate
- LLM token cost per transaction
- Alerting: threshold kompensasi > X% dalam 1 jam → alert engineer.
Strategi & Insight: Biar Nggak Cuma Jalan, Tapi Nyaman di Produksi
- Mulai dari 3 step paling riskan: billing, data store, dan notification. Selesaikan kompensasinya dulu.
- Gunakan natural correlation ID (transaction_id yang sama) lintas semua log & email supaya mudah ditelusuri.
- Prefer “compensate benign”: misal, batalkan subscription tapi tetap kirim email permintaan maaf plus voucher — ini lebih baik ketimbang dibiarkan menggantung.
- Cache policy di repo: mapping step → kompensasi sebagai file JSON/YAML yang versioned. Orchestrator hanya membaca, bukan meng-hardcode.
- Fail fast di ujung akhir: langkah yang paling sulit dikompensasi (contoh email) letakkan di belakang; jangan kirim email kalau belum yakin langkah sebelumnya sukses.
- Integrasi API yang tidak punya delete/void: simpan reference agar kamu bisa bikin “soft compensate” (misal tandai record sebagai voided, bukan hapus).
Checklist Implementasi Saga Pattern di n8n
- Buat Saga Log Store (tabel: saga_headers, saga_steps).
- Siapkan template step (do+compensate) untuk integrasi kamu yang utama.
- Pasang Idempotency-Key ke semua API yang mendukung.
- Tambahkan AI Agent dengan policy yang jelas + guardrail (mode saran).
- Buat Slack alert untuk kompensasi gagal atau transaksi > durasi X.
- Uji chaos: simulasi error 429/500/timeout.
Penutup: Saatnya Build — Jadikan Workflow Kamu “Transaksional”
Kamu sudah punya blueprint yang jelas untuk menerapkan Saga Pattern di n8n automation dengan bantuan AI Agent. Mulai dari use case upgrade plan (Stripe + Supabase + LaunchDarkly + Postmark), kamu bisa adaptasi ke refund, provisioning akun enterprise, sampai two-way sync antar SaaS. Ajak tim kamu untuk vibe coding: definisikan step + kompensasi, jalankan shadow mode, lalu go live.
CTA: Clone workflow kamu sekarang, buat Orchestrator “Saga Upgrade”, dan uji di staging. Kalau kamu pengen template siap pakai + sample kompensasi untuk Stripe/Supabase/LaunchDarkly, join JIPRAKS Classroom — kita bahas end-to-end sambil pair-build.