Lesson 0024 · System Design · Modul Reliabilitas & API · ±20 menit

Monolith vs microservices

Tiga bentuk aplikasi, harga yang dibayar saat memecahnya, transaksi yang tidak lagi muat di satu database, dan kenapa jawaban default di interview adalah monolith

Sebelumnya, di lesson 0023, Anda melihat trace melintasi empat service. Lesson ini bertanya: kenapa ada empat service sejak awal? Ini salah satu tempat kandidat paling sering terlihat over-engineer di interview.

Target lesson ini: Anda bisa menjawab "Monolith atau microservices?" dalam 60 detik: membela monolith sebagai default dengan angka, menyebut tiga biaya microservices, menjelaskan saga untuk transaksi lintas service, dan menyebut sinyal yang membenarkan pemecahan.

1. Tiga bentuk

Monolith App (semua kode) 1 database Modular monolith 1 deployable order bayar user 1 DB, tabel per modul Microservices panggilan lewat jaringan order bayar user DB DB DB
Dari kiri ke kanan, setiap langkah menambah kebebasan tim dan biaya operasional. Modular monolith memberi batas kode yang jelas tanpa membayar jaringan dan database terpisah.

2. Harga microservices

Keuntungannya nyata: tim kecil men-deploy service sendiri tanpa menunggu tim lain, service di-scale terpisah, dan perubahan skema hanya memengaruhi satu service. Azure Architecture Center juga mendaftar tantangannya [1]:

3. Distributed transaction dan saga

Di monolith, "buat order, tagih kartu, kurangi stok" adalah satu transaksi database: semua berhasil atau semua dibatalkan. Di microservices, ketiga data itu ada di tiga database berbeda, dan jaminan ACID tradisional tidak langsung berlaku untuk beberapa data store yang dikelola terpisah. Model transaksi tradisional seperti two-phase commit (protokol yang menahan semua peserta sampai semuanya setuju untuk commit) ada, tapi Azure mengarahkan arsitektur seperti ini ke pola saga. [2]

Alternatifnya pola saga: urutan transaksi lokal, satu per service. Setiap langkah menyelesaikan transaksinya, memperbarui database-nya, lalu memicu langkah berikutnya lewat event atau pesan. Kalau satu langkah gagal, saga menjalankan compensating transaction yang membalik langkah yang sudah selesai. [2]

order: buat order (PENDING)→ payment: tagih kartu · gagal→ kompensasi: order dibatalkan

Konsekuensinya: di antara langkah, sistem berada di state sementara (order PENDING terlihat oleh user), dan setiap langkah harus idempotent karena pesannya bisa terkirim ulang (lesson 0017). Ini biaya yang tidak ada sama sekali di monolith.

4. Service discovery, singkat

Instance service berganti terus (deploy, autoscaling, crash), jadi alamat IP tidak bisa ditulis di konfigurasi. Service discovery memberi nama stabil di depan instance yang berubah. Di Kubernetes (platform yang menjalankan dan mengatur container di banyak mesin), client di dalam cluster menemukan Service lewat environment variable atau DNS; server DNS seperti CoreDNS memantau Service baru dan membuat record DNS untuk masing-masing. [3] Jadi service A cukup memanggil http://payment. Di interview, cukup sebut namanya dan fungsinya.

Latihan 1 — Monolith, microservices, discovery

Jawab tanpa scroll ke atas. Soal yang sama akan muncul lagi, diacak, di review 0026.

Kuis di lesson ini adalah feedback cepat, bukan bukti penguasaan; yang dicatat hanya hasil review 0026.

Latihan 2 — Distributed transaction

5. Kapan tidak perlu

Track ini memakai monolith sebagai default, dan di interview Anda sebaiknya juga begitu. Ini prinsip inti track (ukur dulu, perubahan termurah dulu), bukan kutipan dari satu sumber: microservices menyelesaikan masalah organisasi dan skala yang berbeda per bagian, dan masalah itu harus terlihat dulu sebelum biayanya dibayar.

Sinyal yang membenarkan memecah service: beberapa tim (bukan beberapa engineer) saling menunggu untuk deploy atau sering konflik di codebase yang sama; satu modul punya kebutuhan sumber daya yang sangat berbeda (misalnya pemrosesan video butuh CPU sepuluh kali lipat dari bagian lain dan harus di-scale terpisah); atau satu bagian butuh siklus rilis atau isolasi kegagalan yang berbeda. Jumlah user saja hampir tidak pernah menjadi alasan: 1.000 sampai 100.000 user aktif harian masih di bawah kapasitas beberapa server di belakang load balancer.

Biaya dan risiko: pipeline deploy, monitoring, dan tracing per service; panggilan jaringan yang bisa gagal; saga dan state sementara untuk transaksi; data yang dulu satu JOIN sekarang dua panggilan API. Batas service yang salah lebih mahal diperbaiki daripada batas modul yang salah.

Alternatif lebih murah: modular monolith (batas modul yang dijaga), scale horizontal monolith yang stateless di belakang load balancer (lesson 0005), dan memindahkan pekerjaan berat ke worker lewat queue (lesson 0016). Kalau sinyal di atas muncul, pecah satu modul yang terbukti perlu, bukan semuanya.

Latihan lisan — Ucapkan dengan suara keras

Pasang timer dan jawab dengan suara keras, seolah sedang interview. Jangan buka jawaban contoh sebelum selesai. Soal ini juga ada di bank soal dan bisa ditarik review 0026.

"Tim kita 6 engineer dengan 5.000 user aktif harian, dan CTO ingin pindah ke microservices. Apa saran Anda?" (60 detik)
Bandingkan dengan jawaban contoh dan checklist-nya

"Untuk skala ini saya sarankan tetap monolith, tapi dirapikan menjadi modular monolith: satu deployable, satu database, modul dengan batas jelas dan tabel milik masing-masing. 5.000 DAU itu jauh di bawah satu QPS rata-rata, jadi satu server dan satu database cukup, dan 6 engineer adalah satu tim. Microservices menambah biaya nyata: service discovery, latency jaringan antar service, tracing, deploy pipeline per service, dan yang paling berat, transaksi lintas database yang harus diganti saga dengan compensating transaction. Sinyal untuk memecah satu modul: beberapa tim saling menunggu saat deploy, atau satu modul punya kebutuhan skala yang sangat berbeda, misalnya pemrosesan gambar yang butuh CPU sepuluh kali lipat. Kalau sinyal itu muncul, saya pecah satu modul itu dulu, bukan semuanya."

Checklist: apakah Anda menyebut…

  • monolith (modular) sebagai default untuk skala dan tim ini?
  • angka: DAU kecil, satu server + satu database cukup, satu tim?
  • biaya microservices: discovery, latency jaringan, operasional?
  • distributed transaction: saga dengan compensating transaction?
  • sinyal memecah: tim saling menunggu deploy atau kebutuhan skala berbeda?
  • memecah satu modul yang terbukti perlu, bukan semuanya sekaligus?

Lulus jika minimal 4 dari 6.

Bacaan lanjutan (opsional, tidak dihitung dalam durasi) Azure Architecture Center: Microservices architecture style, terutama bagian "Challenges", ±15 menit.

Berikutnya, lesson 0025: memecah service adalah anak tangga terakhir. Lesson penutup modul ini merangkai semua anak tangga sebelumnya, dari mengukur sampai memecah.

Istilah: GLOSSARY.md (bagian "Reliabilitas & API") · Indeks: semua lesson System Design

Ada yang belum jelas? Tanyakan ke saya (agent) di terminal, misalnya: "Apa beda saga choreography dan orchestration?", "Bagaimana menjaga batas modul di modular monolith supaya tidak bocor?"

Sumber: [1] Azure Architecture Center: Microservices architecture style · [2] Azure Architecture Center: Saga pattern · [3] Kubernetes docs: Service, Discovering services