MUHAMMAD
FARI
MADYAN
[ Press ESC or Click to Skip ]

Fleet Management System

1

Part 1: Pengenalan & Arsitektur Sistem

2

Part 2: Dashboard Real-Time dengan Next.js

3

Part 3: Backend API dengan NestJS

4

Part 4: Admin Panel & Logika Bisnis dengan Laravel

5

Part 5: Desain Database — PostgreSQL, MySQL & Redis

6

Part 6: Prinsip SOLID & Design Patterns

7

Part 7: Dari Monolith ke Microservices

8

Part 8: DevSecOps, CI/CD & Production Deployment

Artikel ini tersedia dalam Bahasa Inggris

🇬🇧 Read in English
🇮🇩 Bahasa Indonesia📚 Fleet Management System

Fleet Management Part 7: Dari Monolith ke Microservices

Mentransformasi monolith menjadi microservices. Service boundaries, komunikasi antar-service, API gateway, saga pattern, dan kapan TIDAK menggunakan microservices.

Muhammad Fari MadyanPenulis

3 menit baca

·

26 Mei 2026


Apa itu Microservices?

Monolith = Satu restoran di mana satu chef memasak semuanya. Jika chef sakit, seluruh restoran tutup.

Microservices = Food court dengan gerai spesialisasi. Satu gerai bikin pizza, satu bikin sushi, satu bikin kopi. Jika gerai pizza tutup maintenance, Anda tetap bisa dapat sushi dan kopi.

Monolith: Microservices: ┌─────────────────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ Semuanya │ │Pizza │ │Sushi │ │Kopi │ │ dalam satu │ → │Gerai │ │Gerai │ │Gerai │ │ aplikasi │ └──┬───┘ └──┬───┘ └──┬───┘ └─────────────────┘ │ │ │ ┌──▼───┐ ┌──▼───┐ ┌──▼───┐ │ DB 1 │ │ DB 2 │ │ DB 3 │ └──────┘ └──────┘ └──────┘

Kapan TIDAK Menggunakan Microservices (Perspektif Senior)

Ini bagian terpenting. Kebanyakan tutorial mengajarkan cara membangun microservices tapi tidak pernah mengajarkan kapan tidak.

FaktorGunakan MonolithGunakan Microservices
Ukuran tim1-5 developer10+ developer
Kompleksitas domainFitur sederhana, terkaitDomain berbeda, independen
Kebutuhan skalaBeban seragamBeberapa bagian butuh 10x resource
OrganisasiSatu timTim otonom multiple

Mengapa Kita Pilih Hybrid (3 Service, Bukan 30)

  1. Fleet API (NestJS) — CRUD armada, auth, perencanaan rute
  2. Admin Service (Laravel) — Admin panel internal, invoice, jadwal
  3. Telemetry Service (NestJS) — Ingesti GPS, monitoring BBM, alert

Ini terpisah karena:

  • Frekuensi update berbeda — Telemetri berubah mingguan, admin panel bulanan
  • Kebutuhan scaling berbeda — Telemetri proses 1000+ pesan/menit, admin 10 user
  • Kebutuhan tech berbeda — Telemetri butuh PostgreSQL + Redis, admin butuh MySQL + Filament

Komunikasi Antar-Service

1. Sinkron (REST) — Request-Response

TYPESCRIPT

@Injectable()
export class TelemetryClient {
  async getVehiclePosition(truckId: string): Promise<Position> {
    const { data } = await this.httpService.axiosRef.get(
      `${TELEMETRY_URL}/api/telemetry/position/${truckId}`,
      { timeout: 3000 }, // Selalu set timeout!
    );
    return data;
  }
}

2. Asinkron (Message Queue) — Event-Driven

TYPESCRIPT

// Telemetry Service mempublikasi event
await this.redis.publish('telemetry:gps-update', JSON.stringify({
  truckId, lat, lng, speed, timestamp: Date.now(),
}));

// Fleet API berlangganan event
this.redis.subscribe('telemetry:gps-update', (message) => {
  const data = JSON.parse(message);
  this.wsGateway.broadcastPosition(data);
});

API Gateway Pattern

NGINX

server {
    location /api/vehicles { proxy_pass http://fleet_api; }
    location /api/telemetry { proxy_pass http://telemetry_api; }
    location /admin { proxy_pass http://admin_api; }
}

Frontend hanya kenal satu URL. SSL termination di satu tempat. Rate limiting diterapkan seragam.


Saga Pattern: Transaksi Terdistribusi

Bagian tricky dari microservices: transaksi yang meliputi beberapa service.

1. Fleet API: Assign driver ke kendaraan ✅
   → Publish event "driver.assigned"

2. Admin Service: Terima event, buat invoice ❌ GAGAL!
   → Publish event "invoice.failed"

3. Fleet API: Terima "invoice.failed", rollback assignment driver

TYPESCRIPT

// Kompensasi saat gagal
@OnEvent('invoice.failed')
async handleInvoiceFailed(event: InvoiceFailedEvent) {
  const vehicle = await this.vehicleRepo.findOneOrFail(event.vehicleId);
  vehicle.currentDriverId = null;
  await this.vehicleRepo.save(vehicle);
  this.logger.warn(`Rollback assignment driver untuk kendaraan ${event.vehicleId}`);
}

Circuit Breaker: Menangani Kegagalan Service

TYPESCRIPT

class CircuitBreaker {
  private failures = 0;
  private state: 'CLOSED' | 'OPEN' | 'HALF_OPEN' = 'CLOSED';

  async call<T>(fn: () => Promise<T>, fallback: T): Promise<T> {
    if (this.state === 'OPEN') {
      if (Date.now() - this.lastFailure > this.resetTimeout) {
        this.state = 'HALF_OPEN';
      } else {
        return fallback; // Langsung return fallback
      }
    }
    try {
      const result = await fn();
      this.onSuccess();
      return result;
    } catch {
      this.onFailure();
      return fallback;
    }
  }
}

Kesalahan Microservices Umum

Kesalahan 1: Distributed Monolith

Jika setiap perubahan service membutuhkan deploy semua service lainnya, Anda punya distributed monolith — semua kompleksitas microservices tanpa manfaatnya.

Kesalahan 2: Shared Database

Jika dua service baca/tulis ke tabel database yang sama, mereka bukan service terpisah sebenarnya.

Kesalahan 3: Terlalu Banyak Service Terlalu Dini

Mulai dengan 2-3 service yang terdefinisi jelas. Anda selalu bisa memecah kemudian.


Selanjutnya

Di Part 8, kita akan bahas DevSecOps — setup pipeline CI/CD dengan GitHub Actions, security scanning, Docker, dan deployment production.


Ini adalah Part 7 dari seri Fleet Management System. Memahami microservices bukan tentang mengetahui pattern-nya — tapi tentang mengetahui kapan menerapkannya dan kapan menahan diri.

Lanjut Membaca

Previous article thumbnail

← Artikel Sebelumnya

Fleet Management Part 6: SOLID Principles & Design Patterns in Practice

Artikel Selanjutnya →

Fleet Management Part 8: DevSecOps, CI/CD & Production Deployment

Next article thumbnail