Memahami service boundary by business capability, komunikasi sync (REST/gRPC) vs async (queue/event), service mesh (Istio/Linkerd), trade-off microservices vs monolith, dan desain service boundaries untuk e-commerce

Setelah di episode 14 kita memahami fault tolerance dan resilience patterns, pada episode ini kita masuk ke arsitektur yang paling sering dibahas dan disalahartikan: microservices. Microservices bukan solusi untuk semua masalah — ia adalah trade-off antara independensi deployment dan operational complexity. Banyak organisasi yang terlalu cepat mengadopsi microservices dan akhirnya terjebak dalam distributed monolith yang lebih buruk dari monolith asli.
Di episode ini kita bedah microservices secara jujur: kapan ia tepat, kapan tidak, dan bagaimana melakukannya dengan benar. Di episode 17 kita akan membahas migrasi dari monolith ke microservices — karena kebanyakan sistem dimulai dari monolith.
Business capability adalah "apa yang bisnis lakukan" — bukan "apa yang sistem lakukan."
| Business Capability | Service | Tanggung Jawab |
|---|---|---|
| Manajemen Pengguna | User Service | Registration, profile, auth |
| Manajemen Produk | Product Service | Catalog, inventory, pricing |
| Pemrosesan Order | Order Service | Cart, checkout, order status |
| Pembayaran | Payment Service | Payment processing, refund |
| Notifikasi | Notification Service | Email, push, SMS |
Kapan pakai: query yang membutuhkan response langsung (get product detail, check availability).
Kapan pakai: operasi yang bisa ditunda (send email, update analytics, process payment async).
Service mesh (Istio, Linkerd) mengelola komunikasi antar service di level infrastruktur.
| Fitur | Penjelasan |
|---|---|
| Traffic management | Load balancing, routing, circuit breaking |
| Security | mTLS antar service, authorization policy |
| Observability | Distributed tracing, metrics, logging |
| Resilience | Retry, timeout, rate limiting |
Service A → Sidecar Proxy (Envoy) → Network → Sidecar Proxy → Service B
Semua traffic melalui sidecar proxy → proxy handle:
- mTLS encryption
- Circuit breaking
- Load balancing
- Distributed tracingStartup kecil (<10 engineer)?
→ Monolith (fokus build product, bukan infra)
Tim sudah besar (>20 engineer)?
→ Pertimbangkan split ke microservices untuk independensi
Satu service sering crash mempengaruhi semua?
→ Pecah service yang bermasalah
Deployment tetap butuh coordination semua tim?
→ Pecah untuk independent deployWarning
Microservices bukan starting point yang tepat untuk kebanyakan startup. Mulai dari monolith yang terstruktur (modular monolith), lalu pecah ke microservices saat ada kebutuhan nyata. "Don't start with microservices" adalah wisdom yang terbukti di ribuan organisasi.
Monolith (satu codebase):
├── users/
├── products/
├── orders/
├── payments/
└── notifications/
Microservices (setiap folder jadi service):
├── user-service (PostgreSQL, REST API)
├── product-service (PostgreSQL, gRPC)
├── order-service (PostgreSQL, REST + events)
├── payment-service (PostgreSQL, gRPC)
└── notification-service (Redis, event-driven)User Service ↔ Product Service: REST (query user data)
Order Service → Payment Service: gRPC (create payment)
Order Service → Notification Service: Event (order created)
Payment Service → Order Service: Event (payment processed)Inti yang harus dibawa pulang:
Di episode 16 selanjutnya kita akan membahas event-driven architecture & CQRS — event emitter, event broker (Kafka), choreography vs orchestration (saga pattern), CQRS (command query responsibility segregation), dan outbox pattern untuk reliable event publishing. Event-driven adalah pola komunikasi yang powerful untuk microservices!