Saga Pattern Distributed Transactions: Panduan & Implementasi

Saga Pattern adalah sebuah desain pola arsitektur perangkat lunak yang digunakan untuk mengelola transaksi terdistribusi dalam sistem berbasis mikroservis (microservices) tanpa mengandalkan mekanisme penguncian global atau transaksi atomik tradisional seperti Two-Phase Commit (2PC). Dalam pola ini, transaksi dipecah menjadi rangkaian transaksi lokal yang dieksekusi oleh masing-masing servis secara berurutan. Jika terjadi kegagalan pada salah satu langkah, Saga menjalankan transaksi kompensasi (compensating transactions) untuk membatalkan perubahan yang telah dilakukan sebelumnya guna menjaga konsistensi data akhir (eventual consistency).

Pola ini menjadi standar industri dalam arsitektur modern karena basis data terdistribusi tidak mendukung ACID secara lintas-servis akibat batasan performa dan skalabilitas CAP Theorem. Dengan menggunakan Saga, sistem tetap dapat beroperasi secara asinkron, mandiri, dan sangat skalabel.

Dua Pendekatan Utama Saga Pattern

Implementasi Saga secara umum dibagi menjadi dua pendekatan arsitektural utama yang memiliki karakteristik, kelebihan, dan kekurangan masing-masing:

Pendekatan Cara Kerja Kelebihan Kekurangan
Choreography Servis saling berkomunikasi melalui event bus (pub/sub) tanpa adanya pengontrol terpusat. Setiap servis mendengarkan event dan memicu aksi berikutnya. Desember longgar (loosely coupled), tidak ada titik kegagalan tunggal (SPOF) pada orkestrator. Alur transaksi sulit dilacak, potensi siklus dependensi antar event, kompleksitas meningkat seiring bertambahnya servis.
Orchestration Sebuah komponen terpusat (Orchestrator) mengatur seluruh alur transaksi, memanggil servis satu per satu, dan memutuskan apakah perlu kompensasi. Alur terpusat dan mudah dipahami, tidak ada circular dependencies, memudahkan manajemen error dan status transaksi. Orchestrator bisa menjadi bottleneck atau single point of failure jika tidak dirancang dengan high availability.

Contoh Implementasi Skenario E-Commerce

Sebagai ilustrasi nyata, ambil contoh transaksi pembelian produk dalam sistem e-commerce yang melibatkan tiga mikroservis berbeda: Order Service, Payment Service, dan Inventory Service.

  1. Order Service membuat pesanan dengan status Pending.
  2. Payment Service memproses pembayaran kartu kredit. Jika gagal, transaksi dihentikan.
  3. Inventory Service mengurangi stok barang. Jika stok habis, proses gagal dan memicu kompensasi.

Jika langkah ketiga (Inventory Service) gagal karena stok habis, maka Saga harus mengeksekusi langkah kompensasi: Payment Service melakukan refund dana, dan Order Service mengubah status pesanan menjadi Cancelled.

Contoh Kode Orchestrator Sederhana (Node.js)


const axios = require('axios');

async function executeOrderSaga(orderData) {
  let paymentProcessed = false;
  let inventoryReserved = false;

  try {
    // Langkah 1: Buat Order
    const order = await axios.post('http://order-service/orders', orderData);
    
    // Langkah 2: Proses Pembayaran
    await axios.post('http://payment-service/pay', { orderId: order.data.id, amount: order.data.total });
    paymentProcessed = true;

    // Langkah 3: Kurangi Stok
    await axios.post('http://inventory-service/reserve', { items: order.data.items });
    inventoryReserved = true;

    // Selesai
    return { status: 'SUCCESS', orderId: order.data.id };

  } catch (error) {
    console.error('Transaksi gagal, memulai kompensasi...', error.message);

    // Kompensasi Berurutan Kebalikan
    if (inventoryReserved) {
      await axios.post('http://inventory-service/release', { orderId: orderData.id }).catch(e => console.error(e));
    }
    if (paymentProcessed) {
      await axios.post('http://payment-service/refund', { orderId: orderData.id }).catch(e => console.error(e));
    }

    return { status: 'FAILED', reason: error.message };
  }
}

Tips Implementasi dan Troubleshooting Lapangan

  • Idempotency: Pastikan setiap endpoint servis bersifat idempotent. Jika sebuah transaksi kompensasi dipanggil dua kali akibat timeout jaringan, sistem tidak boleh melakukan refund atau pengurangan stok ganda.
  • Eventual Consistency: Sediakan dashboard atau sistem monitoring status (seperti Jaeger atau Zipkin) untuk melacak jejak transaksi terdistribusi yang sedang berjalan.
  • Asynchronous Retries: Gunakan message broker seperti Apache Kafka atau RabbitMQ dengan mekanisme Dead Letter Queue (DLQ) untuk menangani kegagalan jaringan sementara.