Microservices menjanjikan skalabilitas dan kecepatan rilis, tetapi dibayar dengan kompleksitas operasional. Episode ini membahas cara menentukan batas service, pola event-driven dengan queue dan stream, serta saga pattern untuk transaksi lintas-service yang konsisten

Di episode 3 kita membahas trade-off monolith vs microservices dan menyimpulkan: mulai dari monolith, pisah saat benar-benar butuh. Episode ini membahas bagaimana memisahkannya dengan benar — karena microservices yang salah dipecah justru menghasilkan "distributed monolith": kompleksitas microservices tanpa benefitnya.
Kunci microservices bukan jumlah service, melainkan batas yang benar (boundaries) dan komunikasi yang asinkron. Episode ini membahas keduanya, ditutup dengan saga pattern — cara menjaga konsistensi data ketika transaksi membentang banyak service.
Cara terbaik memecah service adalah berdasarkan domain bisnis — lewat pendekatan Domain-Driven Design (DDD). Setiap service memegang satu domain yang kohesif: orders, payments, inventory, users. Aturannya sederhana:
BENAR:
orders-service (domain: order, data: orders DB)
payment-service (domain: pembayaran, data: payments DB)
inventory-service (domain: stok, data: inventory DB)
SALAH (distributed monolith):
service-akses-database ← semua service baca DB yang sama
service-util ← "fungsi umum" tanpa domain jelasWaspadai tanda-tanda ini di arsitektur kalian:
Jika tanda ini muncul, batas service belum benar — dan kompleksitas yang dibayar tidak sebanding.
Salah satu keputusan arsitektur utama: bagaimana service berkomunikasi. Dua pola asinkron yang paling umum:
| Pola | Karakter | Contoh Cloud |
|---|---|---|
| Queue | Satu event dikonsumsi satu consumer, pesan dihapus | SQS, RabbitMQ |
| Stream | Event bertahan, banyak consumer, replayable | Kafka, Kinesis |
Perbedaan praktisnya: queue untuk work distribution (task diproses sekali), stream untuk event log (banyak sistem memakannya). Pilih berdasarkan kebutuhan.
Ketika order dibuat, satu event dipublish. Banyak service bereaksi secara independen — inventory mengurangi stok, notification mengirim email, analytics mencatat. Tidak ada yang memblokir yang lain, dan masing-masing bisa diskalakan sendiri.
Tip
Manfaat tersembunyi dari event-driven: tim bisa menambahkan consumer baru tanpa mengubah publisher. Ingin fitur "rekomendasi produk"? Cukup subscribe ke event yang sudah ada. Ini contoh nyata cara arsitektur mengurangi biaya perubahan.
Transaksi bisnis sering membentang banyak service. Contoh: order → bayar → kirim. Tidak ada satu database yang bisa menjamin atomik semuanya (episode 5). Saga adalah jawabannya: transaksi besar dipecah menjadi langkah-langkah lokal, masing-masing dengan transaksi sendiri dan compensation bila langkah berikutnya gagal.
Setiap service mendengar event dan melakukan aksinya; jika gagal, mempublish event kompensasi.
Choreography sederhana tanpa orchestrator, tapi alurnya menyebar dan sulit dilacak.
Satu saga orchestrator (service sentral) mengarahkan langkah demi langkah dan memutuskan kompensasi.
Orchestration lebih mudah dipahami dan di-debug — alurnya terpusat. Ini pilihan yang tepat untuk saga yang kompleks. Rule of thumb: mulai dari orchestration; gunakan choreography hanya untuk alur sederhana.
Kerangka desain untuk sistem event-driven baru:
order.created, payment.completed).order.created.v1) agar consumer lama tidak rusak.Inti yang harus dibawa pulang:
Di episode 13 selanjutnya kita akan membahas serverless & event pipeline — event-driven serverless, workflow orchestration, dan trade-off-nya. Sampai jumpa di episode 13!