Membedah keputusan arsitektur paling penting backend: perbandingan jujur monolith, modular monolith, dan microservices, tren 2026 yang pragmatis, serta cara menyusun struktur service yang sehat

Di episode 0-11 kalian sudah membangun semua keterampilan inti backend: API, database, auth, testing, caching, queue, dan observability. Sekarang tibalah pertanyaan arsitektur yang paling sering diperdebatkan: monolith atau microservices? Jawaban yang naif adalah "microservices pasti lebih baik" — padahal keputusan ini punya konsekuensi besar dan sering disalahpahami.
Mengapa ini penting? Karena arsitektur menentukan cara tim bekerja, cara sistem dideploy, dan cara data dibagi. Microservices yang salah justru menghasilkan sistem yang lebih lambat dan lebih sulit dirawat dibanding monolith yang rapi. Episode ini membahas tiga pendekatan — monolith, modular monolith, dan microservices — plus tren 2026 yang pragmatis: macrolith.
Satu aplikasi, satu codebase, satu deployment. Semua fitur — produk, order, payment, user — hidup di dalamnya.
Satu aplikasi, tapi dipisahkan rapi menjadi modul yang mandiri. Ini langkah pertama yang hampir selalu benar — dan sering kali cukup.
shop-api/
├── src/
│ ├── modules/
│ │ ├── catalog/ # produk & stok
│ │ │ ├── routes.ts
│ │ │ ├── service.ts
│ │ │ └── repository.ts
│ │ ├── order/ # order & pembayaran
│ │ │ ├── routes.ts
│ │ │ ├── service.ts
│ │ │ └── repository.ts
│ │ ├── identity/ # user, auth
│ │ └── notification/ # email worker
│ ├── shared/ # logger, http client, error handler
│ └── app.tsSetiap domain menjadi service terpisah — codebase, deployment, dan database sendiri — berkomunikasi lewat jaringan (HTTP/gRPC, episode 13) atau event (episode 22).
Kesalahan paling mahal di industri bukan memilih monolith — melainkan microservices premature: memecah sistem sebelum memahami domain dan batas antar modulnya. Aturan yang paling pragmatis:
Istilah yang populer di 2026 adalah macrolith — pendekatan tengah yang pragmatis. Prinsipnya: sebagian besar sistem tetap satu aplikasi (modular), dan hanya bagian yang benar-benar perlu yang dipisah sebagai service.
Contoh nyata pada toko online kita:
Macrolith mengakui bahwa bukan semua domain layak microservices — hanya yang punya alasan konkret. Ini meniadakan overhead microservices penuh tanpa menyerah pada skala yang dibutuhkan.
Empat alasan yang sah untuk memecah:
Jika tidak ada satu pun alasan ini di tim kalian, modular monolith hampir pasti cukup.
Note
Perhatikan kesalahan klasik: memecah microservices tapi tetap berbagi satu database. Ini yang terburuk dari dua dunia — kompleksitas jaringan tanpa keuntungan isolasi data. Jika modul berbagi tabel, mereka bukan service mandiri; mereka masih monolith yang dideploy terpisah.
Baik modular monolith maupun microservices bergantung pada batas modul yang disiplin. Tiga aturan:
orders hanya boleh diakses modul order; modul lain lewat API/event.catalog/service.ts tidak pernah memanggil order/repository.ts langsung.Contoh batas yang bocor — dan yang benar:
BOLEH: order/service.ts → notification/sendEmail() (via interface)
BOLEH: order → kafka publish "order.created"
JANGAN: order/repository.ts → query tabel notification.email_queueMemecah tanpa alasan = kompleksitas tanpa manfaat. Mulai modular monolith.
Melanggar isolasi data — mematikan alasan utama microservices.
API → service A → service B → service C secara sinkron membuat latency bertumpuk dan satu kegagalan meruntuhkan rantai. Alihkan dengan event/queue (episode 10, 22).
Service tersebar tanpa tracing (episode 11) = debugging mimpi buruk. Tracing bukan opsional saat sistem terdistribusi.
Warning
Kompleksitas microservices tidak boleh ditambahkan tanpa observability, CI/CD yang matang (episode 15), dan tim yang cukup. Tim kecil dengan microservices justru lebih lambat daripada tim besar dengan modular monolith. Ukur masalah yang mau dipecahkan, bukan tren.
Episode 12 membedah keputusan arsitektur: monolith klasik, modular monolith dengan batas modul yang disiplin, dan microservices untuk alasan yang konkret — plus tren 2026, macrolith, yang memisahkan hanya yang benar-benar perlu.
Inti yang harus dibawa pulang:
Di episode 13 selanjutnya kita akan menyatukan akses antar layanan: API gateway & gRPC — gateway untuk routing dan rate limiting, serta gRPC untuk komunikasi service-to-service yang efisien. Sampai jumpa di episode 13!