Kembali ke Blog
Insight

Node.js Microservices dengan Express, Docker & RabbitMQ: Panduan Lengkap

18 Feb 2026 Idiarsosimbang 7 menit baca
Node.js Microservices dengan Express, Docker & RabbitMQ: Panduan Lengkap

Membangun arsitektur microservices menggunakan Node.js, Express, Docker containers, dan RabbitMQ message broker — dari monolith ke services yang scalable.


Arsitektur microservices sudah menjadi standar di perusahaan teknologi besar, tapi banyak developer Indonesia masih memandangnya sebagai hal yang rumit dan overkill. Kenyataannya, di 2026 tools untuk membangun microservices sudah sangat mature — dan ada skenario di mana microservices memberikan keuntungan nyata bahkan untuk tim kecil. Artikel ini memandu Anda membangun sistem microservices sederhana menggunakan Node.js, Express, Docker, dan RabbitMQ.

Kapan Microservices Masuk Akal?

Sebelum membahas "bagaimana", penting untuk memahami "kapan". Microservices bukan silver bullet — sebenarnya untuk kebanyakan proyek, monolith lebih baik. Anda sebaiknya mempertimbangkan microservices ketika tim sudah lebih dari 8-10 developer dan mulai saling menghalangi di satu codebase, atau ketika ada bagian sistem dari yang traffic-nya sangat berbeda misalnya API publik vs background processing, atau ketika Anda perlu menggunakan technology stack yang berbeda untuk bagian sistem yang berbeda misalnya Python untuk ML sementara Node.js untuk API, atau ketika Anda perlu men-scale bagian tertentu secara independen misalnya service notifikasi yang perlu 10 instance sementara service user hanya butuh 2.

Anti-Pattern: Premature Microservices

Jangan build microservices dari hari pertama untuk proyek baru. Mulai dengan monolith yang well-structured karena code boundaries yang jelas di monolith bisa di-extract menjadi service di kemudian hari. Netflix, Amazon, dan eBay semua mulai dari monolith dan baru beralih ke microservices setelah scale mereka memerlukan itu. Jika Anda membangun microservices untuk proyek dengan 2 developer dan 100 user, Anda sedang membangun complexity tanpa menerima benefit-nya.

Arsitektur Sistem Kita

Untuk tutorial ini, kita akan membangun sistem e-commerce sederhana dengan 4 services:

  • API Gateway: Entry point untuk semua request dari client. Routing, authentication, rate limiting.
  • User Service: Registrasi, login, profil management. Database: PostgreSQL.
  • Product Service: CRUD produk, search, kategori. Database: PostgreSQL.
  • Order Service: Create order, payment processing, order tracking. Database: PostgreSQL.

Komunikasi antar service menggunakan dua cara: synchronous via HTTP/REST untuk query yang butuh response langsung, dan asynchronous via RabbitMQ message queue untuk event notification yang tidak butuh response langsung.

Setup Docker Compose

Docker Compose mengorkestrasi semua services dan dependencies:


# docker-compose.yml
version: '3.8'

services:
  api-gateway:
    build: ./api-gateway
    ports:
      - "3000:3000"
    environment:
      - USER_SERVICE_URL=http://user-service:3001
      - PRODUCT_SERVICE_URL=http://product-service:3002
      - ORDER_SERVICE_URL=http://order-service:3003
    depends_on:
      - user-service
      - product-service
      - order-service

  user-service:
    build: ./user-service
    ports:
      - "3001:3001"
    environment:
      - DATABASE_URL=postgresql://user:pass@user-db:5432/users
      - RABBITMQ_URL=amqp://rabbitmq:5672
    depends_on:
      - user-db
      - rabbitmq

  product-service:
    build: ./product-service
    ports:
      - "3002:3002"
    environment:
      - DATABASE_URL=postgresql://user:pass@product-db:5432/products
    depends_on:
      - product-db

  order-service:
    build: ./order-service
    ports:
      - "3003:3003"
    environment:
      - DATABASE_URL=postgresql://user:pass@order-db:5432/orders
      - RABBITMQ_URL=amqp://rabbitmq:5672
    depends_on:
      - order-db
      - rabbitmq

  user-db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: users
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - user_data:/var/lib/postgresql/data

  product-db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: products
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - product_data:/var/lib/postgresql/data

  order-db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: orders
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - order_data:/var/lib/postgresql/data

  rabbitmq:
    image: rabbitmq:3-management-alpine
    ports:
      - "5672:5672"
      - "15672:15672"

volumes:
  user_data:
  product_data:
  order_data:

Setiap service memiliki database PostgreSQL sendiri — ini adalah prinsip fundamental microservices: database per service. Tidak ada service yang langsung mengakses database service lain. Komunikasi selalu melalui API atau message queue.

API Gateway Pattern

API Gateway adalah single entry point yang menerima semua request dari client dan meneruskannya ke service yang tepat. Implementasi sederhana menggunakan Express dan http-proxy-middleware bertindak sebagai reverse proxy yang juga menambahkan cross-cutting concerns seperti authentication verification, request logging, rate limiting, dan CORS handling. Client tidak perlu tahu tentang internal services — mereka hanya berkomunikasi dengan satu endpoint yaitu API Gateway.

Asynchronous Communication dengan RabbitMQ

Tidak semua komunikasi antar service harus synchronous HTTP. Banyak interaksi yang bisa dan seharusnya asynchronous menggunakan message queue. Contoh: ketika user membuat order baru, Order Service tidak perlu menunggu Email Service mengirim email konfirmasi — cukup publish message "ORDER_CREATED" ke queue, dan Email Service akan mengkonsumsi message tersebut di waktu yang tepat.

Keuntungan asynchronous communication meliputi decoupling di mana service bisa naik-turun secara independen, reliability karena jika consumer service down message tetap tersimpan di queue dan akan diproses saat service kembali online, dan scalability karena bisa menambah consumer instances untuk memproses message lebih cepat tanpa mengubah producer.

Error Handling di Microservices

Error handling di microservices lebih kompleks daripada monolith karena failure bisa terjadi di banyak titik: network timeout, service down, database unavailable, message queue full. Beberapa pattern penting yang harus diimplementasikan termasuk Circuit Breaker yang mendeteksi jika service downstream sedang bermasalah dan berhenti mengirim request kepadanya selama periode tertentu alih-alih terus-menerus timeout, Retry with exponential backoff yang mencoba ulang request yang gagal dengan delay yang semakin lama antar percobaan, Timeout configuration di mana setiap HTTP call antar service harus memiliki timeout yang reasonable misalnya 3-5 detik, dan Fallback response yang memberikan response alternatif ketika service downstream tidak available.

Monitoring dan Observability

Ketika sistem terdiri dari 4+ services, menemukan sumber masalah menjadi seperti mencari jarum dalam tumpukan jerami. Anda memerlukan three pillars of observability: Logging menggunakan centralized logging dengan ELK stack atau Loki dan Grafana supaya log dari semua services bisa dicari di satu tempat, Metrics menggunakan Prometheus dan Grafana untuk monitoring request rate, error rate, dan latency per service, dan Distributed Tracing menggunakan OpenTelemetry untuk melacak satu request dari API Gateway sampai ke service terakhir dan mengidentifikasi di mana bottleneck atau error terjadi.

Deployment Strategy

Untuk deployment microservices di Indonesia, ada beberapa opsi berdasarkan skala. Untuk skala kecil cukup menggunakan Docker Compose di single VPS yang affordable dan simple namun limited alam hal scalability. Untuk skala medium bisa menggunakan Docker Swarm yang merupakan orchestrator sederhana untuk multi-node deployment. Untuk skala besar menggunakan Kubernetes yang merupakan orchestrator paling powerful namun juga paling kompleks. Rekomendasi untuk developer Indonesia yang baru mulai: gunakan Docker Compose dulu sampai benar-benar butuh scaling, lalu pertimbangkan Docker Swarm sebelum lompat ke Kubernetes. Jangan over-engineer infrastructure sebelum product-market fit tercapai.

Kesalahan Umum Microservices

  • Distributed monolith: Services yang tightly coupled dan harus deploy bersamaan — ini lebih buruk dari monolith biasa karena tambah complexity tanpa benefit.
  • Shared database: Dua services mengakses tabel yang sama — ini melanggar prinsip isolation dan akan menyebabkan coupling yang sulit diurai.
  • Terlalu banyak services: Tim 3 orang mengelola 15 services. Rule of thumb: jumlah services tidak boleh melebihi jumlah developer di tim.
  • Mengabaikan data consistency: Tanpa saga pattern atau event sourcing, transaksi yang melibatkan multiple services bisa menghasilkan data inconsistency yang sulit dideteksi.

Microservices architecture adalah tool yang powerful di tangan yang tepat. Untuk developer Indonesia yang ingin mempelajarinya, mulailah dengan membangun monolith yang well-structured dengan clear boundaries antar module. Ketika Anda benar-benar memerlukan microservices, extract module tersebut menjadi service independen satu per satu. Ini pendekatan yang pragmatis dan terbukti berhasil di perusahaan teknologi top di dunia.

Bagikan artikel ini
Chat Kami