L
Next.js & SSR Architecture 🗂️ Cheat Sheet & Decision Tree • Literally Web ID

Arsitektur Hybrid Rendering Next.js: SSR, SSG, dan ISR di Skala Enterprise

⏱️ 15 menit baca • 📅 20 Oct 2026 • 👁️ 3 views
Arsitektur Hybrid Rendering Next.js: SSR, SSG, dan ISR di Skala Enterprise

1. Intisari Kilat: Fondasi dalam Sekali Lirik

Ingat malam-malam panjang saat server down karena traffic flash sale e-commerce tiba-tiba melonjak sepuluh kali lipat? Sebagai arsitek infrastruktur, saya belajar dengan cara yang paling keras: salah memilih strategi rendering pada Next.js di skala enterprise sama saja dengan menggali kuburan untuk performa aplikasi sendiri. Bayangkan jutaan pengguna membuka halaman produk secara bersamaan; jika kita salah menggunakan SSR murni untuk seluruh katalog, Node.js server akan langsung megap-megap kehabisan RAM, sementara Nginx di depan memuntahkan error 502 Bad Gateway.

Di sinilah seni hybrid rendering masuk sebagai penyelamat. Kita tidak bisa lagi memukul rata semua halaman dengan satu pendekatan. Halaman statis seperti Syarat & Ketentuan harus ditangani oleh SSG (Static Site Generation), halaman produk dinamis dengan stok real-time membutuhkan ISR (Incremental Static Regeneration), sementara keranjang belanja dan dashboard pengguna mutlak memerlukan SSR (Server-Side Rendering). Semua strategi ini harus diselaraskan dengan caching layer yang tangguh di Cloudflare Edge dan optimasi manajemen memori pada instance Node.js di balik load balancer.

[!IMPORTANT] Jangan pernah menyamakan beban kerja SSR dan SSG. SSR membebani CPU server secara konstan pada setiap request, sementara SSG dan ISR memindahkan beban tersebut ke tahap build time atau background revalidation, menyisakan latensi mendekati nol bagi end-user.

Mari kita bedah kompas keputusan ini secara lebih mendalam agar Anda tidak salah melangkah saat merancang arsitektur sistem skala masif berikutnya.

2. Kompas Keputusan: Kapan Memilih Solusi Ini vs Alternatif Lain

Memilih strategi rendering ibarat memilih kendaraan untuk medan perang: salah pilih, Anda akan terjebak di tengah lumpur. Mari kita gunakan decision tree berbasis skenario nyata di lapangan:

  • Kondisi A: Katalog e-commerce berisi 2 juta SKU produk dengan deskripsi yang jarang berubah, namun harga dan stok harus up-to-date setiap beberapa menit.

    • Solusi: Gunakan ISR (Incremental Static Regeneration) dengan revalidate: 60. Halaman akan dilayani secara instan dari Edge cache, sementara Next.js secara senyap meregenerasi halaman di background setiap ada request setelah jeda waktu tersebut.
    • Hindari: SSR murni tanpa caching. Ini akan melumpuhkan backend database Anda karena setiap pencarian produk memicu query SQL berat secara repetitif.
  • Kondisi B: Halaman Checkout, Cart, dan User Dashboard yang sangat personal dan spesifik per pengguna.

    • Solusi: Gunakan SSR (Server-Side Rendering). Halaman wajib dirender secara on-the-fly dengan mengambil token otentikasi dari cookie pengguna dan menarik data segar via API backend.
    • Hindari: SSG atau ISR. Menyimpan halaman personal di CDN cache adalah bencana keamanan (data user A bocor ke user B).
  • Kondisi C: Landing Page Marketing, Blog Perusahaan, dan Dokumentasi Produk.

    • Solusi: Gunakan SSG (Static Site Generation). Hasil build berupa file HTML/CSS/JS murni yang di-deploy langsung ke S3 bucket di belakang Cloudflare CDN.
    • Hindari: SSR. Menggunakan server Node.js hanya untuk menampilkan artikel statis adalah pemborosan sumber daya infrastruktur yang masif.

[!TIP] Untuk traffic enterprise yang masif, kombinasikan SSG/ISR dengan Edge Middleware Cloudflare untuk mendeteksi geolokasi pengguna sebelum request menyentuh origin server Next.js Anda.

Transisi mulus dari pemilihan strategi rendering ini menuntut kita untuk memahami bagaimana parameter konfigurasi di level kode dituliskan dengan benar, agar tidak berujung pada kebocoran memori yang mematikan proses Node.js di tengah malam.

3. Contekan Konfigurasi & Parameter Paling Sering Dicari

Berikut adalah parameter esensial pada Next.js (getStaticProps, generateStaticParams, dan konfigurasi next.config.js) yang sering menjadi penentu performa di lingkungan produksi enterprise:

// Contoh implementasi ISR dengan fallback blocking untuk katalog produk masif
export async function getStaticPaths() {
  // Ambil top 1000 produk terlaris untuk di-pre-render saat build time
  const res = await fetch('https://api.domain.com/products/top');
  const products = await res.json();

  const paths = products.map((product) => ({
    params: { id: product.id.toString() },
  }));

  return {
    paths,
    // blocking memastikan request pertama untuk produk non-pre-rendered menunggu SSR selesai,
    // lalu langsung disimpan ke cache untuk request berikutnya.
    fallback: 'blocking',
  };
}

export async function getStaticProps({ params }) {
  const res = await fetch(`https://api.domain.com/products/${params.id}`);
  const product = await res.json();

  if (!product) {
    return { notFound: true };
  }

  return {
    props: {
      product,
    },
    // Regenerasi halaman di background setiap 60 detik jika ada traffic masuk
    revalidate: 60,
  };
}

Dan berikut adalah konfigurasi Nginx reverse proxy di depan cluster Node.js SSR untuk menangani SSL termination, HTTP/2, dan caching header yang optimal:

# Konfigurasi Nginx untuk Reverse Proxy Next.js SSR Cluster
upstream nextjs_cluster {
    server 127.0.0.1:3000 max_fails=3 fail_timeout=10s;
    server 127.0.0.1:3001 max_fails=3 fail_timeout=10s;
    keepalive 32;
}

server {
    listen 443 ssl http2;
    server_name shop.domain.com;

    ssl_certificate /etc/letsencrypt/live/shop.domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/shop.domain.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    location / {
        proxy_pass http://nextjs_cluster;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Nonaktifkan buffering untuk streaming SSR jika diperlukan
        proxy_buffering off;
    }

    # Cache static assets Next.js secara agresif di Nginx
    location /_next/static/ {
        proxy_pass http://nextjs_cluster;
        expires 365d;
        add_header Cache-Control "public, max-age=31536000, immutable";
    }
}

[!WARNING] Pastikan Anda tidak mengatur revalidate terlalu rendah (misalnya 1 detik) pada halaman dengan traffic jutaan pengunjung, karena ini akan menciptakan cache stampede yang membanjiri database Anda dengan ribuan query bersamaan.

Pengaturan konfigurasi di atas adalah fondasi yang kokoh, namun operasional harian di terminal Linux tetap membutuhkan deretan mantra sakti untuk memonitor kesehatan server.

4. Koleksi Mantra One-Liner Siap Salin untuk Keseharian

Sebagai site reliability engineer, Anda tidak punya waktu untuk membuka GUI dashboard yang rumit saat insiden terjadi. Berikut adalah koleksi one-liner terminal untuk mendiagnosis masalah performa rendering dan Node.js memory leak secara instan:

# 1. Cek konsumsi memori aktual dari seluruh proses Node.js yang menjalankan SSR
ps aux | grep node | awk '{print "PID: " $2 " | RSS Memory: " $6/1024 " MB | Command: " $11}'

# 2. Pantau real-time status HTTP status code yang masuk ke Nginx reverse proxy
sudo tail -f /var/log/nginx/access.log | awk '{print $9, $7}'

# 3. Lakukan stress testing endpoint SSR dengan Apache Bench (ab) untuk mengukur TTFB
ab -n 1000 -c 50 -H "Accept-Encoding: gzip" https://shop.domain.com/product/12345

# 4. Cek koneksi aktif TCP ke port Node.js untuk mendeteksi potensi connection pool exhaustion
ss -s | grep estab

# 5. Jalankan garbage collection manual atau force restart PM2 cluster saat memory kritis
pm2 reload all --update-env

[!TIP] Simpan skrip one-liner di atas ke dalam file alias .bashrc Anda untuk mempercepat eskalasi penanganan insiden di tengah malam.

Namun, sehebat apapun mantra terminal Anda, ada beberapa kesalahan fatal yang kerap dilakukan developer pemula yang berpotensi melumpuhkan seluruh infrastruktur produksi.

5. Jalur Bahaya: Dosa Besar yang Wajib Dihindari di Produksi

Pengalaman mengajarkan bahwa kegagalan sistem jarang disebabkan oleh bug kode yang kompleks, melainkan oleh praktik-praktik buruk arsitektur yang dibiarkan menumpuk. Berikut adalah dosa besar yang wajib Anda hindari:

  1. Melakukan Query Database Langsung di dalam Komponen Client-Side Tanpa API Layer: Ini mengekspresikan kredensial database langsung ke browser dan membuka celah keamanan SQL Injection yang fatal.

  2. Mengabaikan Manajemen Memory Leak pada Global Variable di SSR: Menyimpan data cache atau state global di dalam memori proses Node.js (misalnya menggunakan global.cache = []) tanpa mekanisme pembatasan ukuran (LRU Cache) akan membuat RAM server membengkak hingga terjadi Out of Memory (OOM) Killer oleh kernel Linux.

  3. Salah Konfigurasi Cache-Control Header dari CDN: Memasang Cache-Control: public, max-age=86400 pada halaman yang mengandung data privat keranjang belanja pengguna, menyebabkan data sensitif tersebut tersimpan di edge cache Cloudflare dan dapat dilihat oleh publik.

  4. Menyalakan fallback: true tanpa Penanganan Loading State yang Kokoh: Jika pengguna mengakses halaman produk baru yang belum di-generate, server akan merender on-the-fly. Jika database lambat, koneksi HTTP akan menggantung (hanging), memicu timeout massal pada load balancer.

Dengan menghindari jebakan-jebakan ini dan menerapkan pola hybrid rendering secara disiplin, infrastruktur e-commerce Anda tidak hanya akan bertahan menghadapi lonjakan traffic, tetapi juga memberikan pengalaman pengguna yang cepat, responsif, dan aman di skala enterprise.

🏷️ Tags: #Cloudflare #Next.js #Ssr #Ssg #Isr