Definisi Event-Driven Architecture (EDA)
Event Driven Architecture (EDA) atau Arsitektur Berbasis Peristiwa adalah sebuah pola desain perangkat lunak dimana alur kerja sistem didorong oleh peristiwa (event) yang terjadi di dalam atau di luar aplikasi. Setiap kali suatu peristiwa terjadi misalnya, pengguna menekan tombol, sensor mengirim data, atau layanan lain menghasilkan output peristiwa tersebut akan dipublikasikan ke sebuah event bus atau message broker . Komponen lain yang tertarik pada peristiwa tersebut (subscriber) kemudian akan menanggapi dengan menjalankan logika bisnis yang relevan.
Berbeda dengan arsitektur tradisional yang bersifat request response (sinkron), EDA bersifat asinkron dan loosely coupled, sehingga komponen dapat beroperasi secara independen dan skalabel.
Komponen Utama dalam EDA
- Event Producer (Penghasil Peristiwa): Bagian sistem yang menghasilkan peristiwa. Contohnya, aplikasi front end yang mengirimkan perintah order created .
- Event Channel (Saluran Peristiwa): Media transport yang menyalurkan peristiwa dari producer ke consumer. Umumnya berupa message broker seperti Apache Kafka, RabbitMQ, atau AWS SNS.
- Event Consumer (Pengkonsumsi Peristiwa): Komponen yang mendengarkan peristiwa tertentu dan mengambil aksi yang sesuai, misalnya layanan pembayaran yang menanggapi order created .
- Event Store (Penyimpanan Peristiwa): Opsional, digunakan untuk menyimpan riwayat peristiwa sehingga sistem dapat melakukan replay atau audit.
- Event Router / Dispatcher: Mengatur aturan routing peristiwa ke consumer yang tepat, seringkali diprogram dalam broker itu sendiri.
Kelebihan Menggunakan EDA
1. Skalabilitas Tinggi Karena komponen bersifat terpisah, setiap layanan dapat ditingkatkan secara independen sesuai beban kerja.
2. Loose Coupling Produsen tidak perlu tahu siapa konsumen peristiwa, hanya mengirimkan peristiwa ke saluran. Hal ini memudahkan penambahan atau perubahan layanan tanpa mengganggu yang lain.
3. Responsivitas Real Time Sistem berbasis peristiwa dapat memproses data begitu peristiwa terjadi, ideal untuk aplikasi IoT, perdagangan saham, atau notifikasi.
4. Fault Tolerance Dengan mekanisme queue dan retry, peristiwa yang gagal diproses dapat disimpan dan diproses ulang tanpa kehilangan data.
5. Evolusi Produk Versi baru layanan dapat berlangganan pada peristiwa lama tanpa perlu migrasi data yang besar.
Tantangan dan Hal yang Perlu Diperhatikan
- Kompleksitas Operasional: Memantau broker, mengelola skema peristiwa, dan menjaga konsistensi data membutuhkan tool khusus.
- Ordering & Idempotensi: Pada sistem yang sangat sensitif, urutan peristiwa harus terjaga, dan aksi perlu idempotent agar tidak menimbulkan duplikasi.
- Debugging: Karena alur kerja tersebar, menelusuri akar masalah dapat lebih sulit dibandingkan model monolitik.
- Keamanan: Peristiwa yang mengandung data sensitif harus dienkripsi dan di authentikasi dengan baik.
- Skema Peristiwa: Perubahan struktur peristiwa (mis. menambah field) harus direncanakan agar tidak memutuskan kompatibilitas dengan consumer lama.
Contoh Implementasi EDA
Berikut contoh sederhana menggunakan Node.js dan RabbitMQ untuk mengilustrasikan proses order created .
/* producer.js */ const amqp = require('amqplib'); async function publishOrder() { const conn = await amqp.connect('amqp://localhost'); const ch = await conn.createChannel(); const exchange = 'orders'; await ch.assertExchange(exchange, 'fanout', {durable:true}); const order = { id: 'ORD123', amount: 250000, createdAt: new Date() }; ch.publish(exchange, '', Buffer.from(JSON.stringify(order))); console.log('Order dipublikasikan:', order); setTimeout(()=>{ conn.close(); }, 500); } publishOrder(); /* consumer.js */ const amqp = require('amqplib'); async function consumeOrders() { const conn = await amqp.connect('amqp://localhost'); const ch = await conn.createChannel(); const exchange = 'orders'; await ch.assertExchange(exchange, 'fanout', {durable:true}); const q = await ch.assertQueue('', {exclusive:true}); await ch.bindQueue(q.queue, exchange, ''); ch.consume(q.queue, msg => { const order = JSON.parse(msg.content.toString()); console.log('Menerima order:', order); // contoh logika: proses pembayaran, kirim notifikasi, dll. ch.ack(msg); }); } consumeOrders(); Dalam contoh di atas, producer mengirimkan objek order ke exchange orders . Setiap consumer yang terhubung ke exchange tersebut akan menerima peristiwa secara otomatis dan mengeksekusi logika masing masing secara independen.
Kesimpulan
Event Driven Architecture menawarkan cara yang fleksibel, skalabel, dan responsif untuk membangun sistem modern. Dengan memisahkan produksi dan konsumsi peristiwa, organisasi dapat mengurangi ketergantungan antar layanan, meningkatkan kecepatan inovasi, dan menyesuaikan infrastruktur sesuai kebutuhan beban kerja. Namun, keberhasilan implementasi EDA memerlukan perencanaan matang terkait desain peristiwa, manajemen infrastruktur, serta strategi monitoring dan keamanan. Jika diterapkan dengan tepat, EDA menjadi fondasi yang kuat bagi aplikasi yang membutuhkan kecepatan, adaptabilitas, dan ketangguhan.