Mengenal empat architectural styles utama — layered, microservices, event-driven, dan modular monolith — beserta karakteristik, trade-off, dan kesalahan umum masing-masing, lalu mempraktikkan cara memilih style yang tepat berdasarkan quality attributes studi kasus e-commerce kalian

Setelah di episode 2 kita membangun fondasi architectural thinking — definisi arsitektur, quality attributes, dan hukum trade-off — pada episode ini kita naik ke tingkat architectural style: bentuk makro struktur sistem yang kalian pilih sebelum menulis satu baris kode pun.
Architectural style adalah pola umum bagaimana komponen diorganisir dan saling berkomunikasi. Analoginya seperti gaya arsitektur bangunan: rumah taman, apartemen, atau gedung bertingkat — semuanya bisa jadi tempat tinggal, tetapi biaya, kapasitas, dan cara merawatnya sangat berbeda. Memilih style adalah salah satu keputusan paling mahal untuk diubah (ingat uji "mahal diubah" dari episode 2), karena style menentukan cara tim bekerja, cara deploy, dan batas skalabilitas sistem selama bertahun-tahun.
Style menjawab dua pertanyaan struktural:
Perhatikan bedanya dengan design pattern (episode 4): design pattern bekerja di level class/modul untuk masalah lokal; style bekerja di level sistem untuk struktur global. Keduanya saling melengkapi, bukan bersaing.
Empat style yang akan kita bahas mencakup mayoritas sistem produksi modern: layered, microservices, event-driven, dan modular monolith.
Layered adalah style paling tua dan paling umum: kode dibagi menjadi lapisan horizontal, dan setiap lapisan hanya boleh memanggil lapisan di bawahnya.
┌──────────────────────────────┐
│ Presentation (API/UI) │
├──────────────────────────────┤
│ Business Logic (domain) │
├──────────────────────────────┤
│ Persistence (repository) │
├──────────────────────────────┤
│ Database │
└──────────────────────────────┘Kelebihannya nyata: sederhana, semua orang langsung paham, konvensi jelas, murah untuk tim kecil. Hampir semua framework populer (Spring MVC, Laravel, Rails, Next.js) secara default mendukung pola ini.
Kekurangannya juga nyata:
| Kelemahan | Dampak Nyata |
|---|---|
| Monolith deployment | Satu bug kecil bisa membawa seluruh aplikasi turun saat deploy |
| Perubahan melintasi semua layer | Menambah satu field sering menyentuh 4+ file |
| Sink hole anti-pattern | Request melewati semua layer tanpa logika bisnis — layer jadi formalitas |
| Scalability seluruh unit | Tidak bisa scale hanya bagian checkout |
Sink hole anti-pattern layak digarisbawahi: jika 80% request di sistem kalian hanya lewat presentation → service → repository → SQL tanpa transformasi, maka lapisan-lapisan itu bukan arsitektur, melainkan birokrasi.
Note
Layered bukan berarti jelek. Untuk aplikasi internal, MVP, atau produk tahap awal, layered sering kali adalah pilihan paling rasional — cepat dibangun, mudah dipahami, dan biaya operasionalnya minimal. Masalah muncul ketika kompleksitas domain dan skala traffic sudah melampaui kemampuannya, tetapi style-nya tidak dievaluasi ulang.
Microservices memecah sistem menjadi service-service kecil yang independen: punya database sendiri, bisa dideploy sendiri, dan dimiliki oleh tim berbeda.
[API Gateway]
│
┌───┼────┬─────────┐
▼ ▼ ▼ ▼
Order Cart Payment Inventory ← tiap service + DB sendiriKelebihan inti:
Tetapi harga yang harus dibayar sering diremehkan:
Richards & Ford menyebut microservices sebagai style dengan trade-off paling ekstrem: kekuatan terbesarnya (decoupling) sekaligus sumber masalah terbesar. Detail penuh kita bahas di episode 12.
Event-driven membalik arah komunikasi: komponen tidak saling memanggil, melainkan menerbitkan (publish) event yang didengarkan (subscribe) oleh pihak lain melalui broker (Kafka, RabbitMQ).
[Checkout Service] --publish--> [Broker/Kafka] --subscribe--> [Inventory]
--subscribe--> [Email Service]
--subscribe--> [Analytics]Kelebihannya:
Kekurangannya jangan dianggap enteng:
Event-driven jarang berdiri sendiri; biasanya ia dikombinasikan sebagai gaya komunikasi di dalam microservices atau modular monolith. Episode 13 membahasnya tuntas termasuk Kafka dan event sourcing.
Modular monolith adalah satu unit deploy dengan pembagian internal yang disiplin: modul-modul memiliki boundary jelas, interface publik, dan data sendiri-sendiri.
[Satu Deployment]
├── module: catalog (public API + private impl)
├── module: ordering (public API + private impl)
├── module: payment (public API + private impl)
└── module: inventory (public API + private impl)Poin kuncinya: dari luar terlihat seperti monolith biasa, tetapi dari dalam ia berperilaku seperti microservices yang "ditempel" sementara — modul tidak boleh mengakses tabel modul lain, komunikasi hanya lewat interface publik.
Mengapa style ini naik daun (dan menjadi tren kuat 2026)?
Dua style lain yang perlu kalian kenali sekilas: pipeline architecture (data mengalir lewat tahapan filter — cocok untuk ETL dan compiler) dan microkernel/plugin architecture (core kecil + plugin — cocok untuk IDE dan browser). Keduanya spesifik domain, jarang jadi style utama aplikasi bisnis.
Ringkasan trade-off berdasarkan quality attributes (skala relatif):
| Attribute | Layered | Microservices | Event-Driven | Modular Monolith |
|---|---|---|---|---|
| Simplicity | Tinggi | Rendah | Sedang | Sedang-Tinggi |
| Deployability | Rendah | Tinggi | Sedang | Tinggi |
| Scalability | Rendah | Tinggi | Tinggi | Sedang |
| Fault isolation | Rendah | Tinggi | Tinggi | Rendah |
| Testability end-to-end | Tinggi | Rendah | Rendah | Sedang |
| Biaya operasional | Rendah | Tinggi | Sedang | Rendah |
| Evolvability | Rendah | Tinggi | Sedang | Sedang |
Tidak ada kolom yang menang semuanya — persis hukum trade-off dari episode 2. Style yang benar ditentukan oleh quality attributes mana yang paling penting bagi konteks kalian.
Mari terapkan pada studi kasus dari episode 2. Quality attributes prioritas kalian:
Sekarang analisis konteksnya:
Evaluasi cepat:
Microservices?
→ deploy independence & scale selektif cocok...
→ tapi: 6 developer, tanpa platform, butuh ACID payment
→ biaya operasional > manfaatnya. BUKAN sekarang.
Layered monolith?
→ simpel, tapi boundary longgar → scalability 10x ragu,
deploy harian berisiko (semua tergabung). Kurang pas.
Event-driven penuh?
→ overkill untuk CRUD-dominan; konsistensi payment jadi sulit.
Modular monolith + event-driven internal? ← PILIHAN
→ deployability tinggi, ACID lokal untuk payment,
boundary modul = jalur migrasi nanti,
event async untuk bagian non-kritis (email, analytics).Keputusan ini sementara dan sadar: modular monolith hari ini dengan rencana evolusi ke services jika tim dan traffic bertumbuh — topik lengkap episode 15.
Important
Aturan praktis yang layak dihafal: mulai dari yang paling sederhana yang masih memenuhi quality attributes wajib kalian, lalu berevolusi. Kompleksitas arsitektur yang ditambahkan lebih awal tidak bisa dilepas mudah; yang ditambahkan belakangan justru terarah karena didorong masalah nyata.
Inti yang harus dibawa pulang dari episode ini:
Di episode 4 selanjutnya kita turun satu level: design patterns & principles — SOLID, pattern GoF yang relevan bagi architect, dan domain-driven design sebagai alat menentukan boundary. Sampai jumpa!