Event-Driven Architecture — System Design

Event-Driven Architecture (EDA) adalah pola arsitektur di mana komponen-komponen sistem berkomunikasi melalui event — notifikasi bahwa sesuatu telah terjadi. Ko

Event-Driven Architecture (EDA) adalah pola arsitektur di mana komponen-komponen sistem berkomunikasi melalui event — notifikasi bahwa sesuatu telah terjadi.

Konsep dasar:

Producer        Event Bus / Broker       Consumer
(pengirim) ──→  "order.created"  ──→  Email Service
                                  ──→  Inventory Service
                                  ──→  Analytics Service

Alih-alih service A memanggil service B secara langsung, A hanya menerbitkan event. Siapa pun yang tertarik bisa subscribe dan merespons.

Komponen EDA:

Implementasi EventBus sederhana:

class EventBus {
  constructor() {
    this.subscribers = {};
  }

  subscribe(event, handler) {
    if (!this.subscribers[event]) {
      this.subscribers[event] = [];
    }
    this.subscribers[event].push(handler);
  }

  unsubscribe(event, handler) {
    if (!this.subscribers[event]) return;
    this.subscribers[event] = this.subscribers[event]
      .filter(h => h !== handler);
  }

  publish(event, data) {
    const handlers = this.subscribers[event] || [];
    handlers.forEach(handler => handler(data));
  }
}

// Penggunaan:
const bus = new EventBus();

// Email service subscribe ke order.created
bus.subscribe("order.created", ({ orderId, userId }) => {
  console.log(`Kirim email konfirmasi order #${orderId} ke user ${userId}`);
});

// Inventory service juga subscribe
bus.subscribe("order.created", ({ orderId, items }) => {
  console.log(`Kurangi stok untuk order #${orderId}`);
});

// Order service publish event
bus.publish("order.created", { orderId: 42, userId: 7, items: [...] });
// Kedua handler dipanggil otomatis!

Keuntungan EDA:

Keuntungan Penjelasan
Decoupling Producer tidak tahu siapa yang akan merespons
Skalabilitas Tambah consumer baru tanpa ubah producer
Resiliensi Consumer bisa mati, event tetap tersimpan di broker
Audit trail Semua event bisa di-log sebagai history

Tantangan EDA:

Pola event umum:

// Domain event — sesuatu yang terjadi di domain bisnis
{ type: "user.registered", userId: 1, email: "[email protected]", timestamp: "..." }

// Integration event — komunikasi antar bounded context
{ type: "payment.completed", orderId: 42, amount: 150000, currency: "IDR" }

// Event sourcing — event sebagai sumber kebenaran (dibahas di pelajaran berikutnya)

Tools EDA:

EDA sangat cocok untuk sistem dengan banyak consumer yang perlu merespons kejadian yang sama secara independen.

🎭 Analogi sehari-hari: Pesta ulang tahun. Ada DJ (producer) putar musik (event). Tamu yang dengar musik = consumer — bisa menari, ngobrol, makan, atau diam aja. DJ gak peduli siapa yang reaksi gimana. One-to-many broadcast tanpa coupling. Kalau orang bisu — gak ada masalah, DJ tetap putar. Kalau ada tamu baru datang — langsung ikut dengar. Tambah/hapus tamu gak ganggu DJ.

💡 Event-Driven vs Command-Driven:

Trade: command lebih predictable + immediate. Event lebih scalable + extensible.

⚠️ Jebakan EDA klasik:

🎯 Kapan pakai EDA:

Hindari EDA untuk:

TL;DR: EDA = service ber-komunikasi via event di broker (Kafka/RabbitMQ). Decoupled + scalable + extensible. Wajib idempotent consumer + correlation ID + schema registry. Cocok multi-consumer event + async workflow.