Menghadirkan aplikasi lebih dekat ke pengguna: memahami serverless functions dan edge runtime, kapan memakai masing-masing, menulis route handler di edge dengan Next.js, serta strategi deployment global.

"Seberapa dekat server kalian ke pengguna?" adalah pertanyaan kinerja yang sering dilupakan. Kalian boleh punya backend paling cepat di dunia — jika ia berada 300 ms dari pengguna, itulah yang mereka rasakan. Episode ini membahas serverless & edge fullstack: model deployment yang menyalakan kode di banyak lokasi dan mengeksekusinya di titik terdekat dengan pengunjung.
Ini bukan hanya soal penyedia cloud — ini mengubah cara kalian menulis kode. Runtime edge berbeda dari runtime Node biasa, dan keputusan "di mana menjalankan kode" menjadi bagian dari desain arsitektur.
| Aspek | Serverless Functions | Edge Runtime |
|---|---|---|
| Lokasi eksekusi | Satu region (mis. singapore) | Jaringan global (ratusan lokasi) |
| Waktu mulai (cold start) | Puluhan–ratusan ms | Milidetik |
| Runtime | Node.js lengkap | V8 yang terpotong |
| Koneksi DB/API | Bisa langsung | Tidak semua (lihat bagian bawah) |
| Latency ke user | Bervariasi per lokasi | Konsisten rendah |
Serverless adalah model "jalankan fungsi saat dipanggil, bayar per pemakaian" — kalian tidak mengelola server sama sekali. Edge menambah dimensi lokasi: kode disalin ke seluruh dunia dan dieksekusi di titik terdekat pengguna.
Tip
Aturan praktis memilih runtime: edge untuk logika ringan yang dekat ke pengguna (redirect, autentikasi cepat, personalisasi, caching headers, geolocation) dan Node runtime untuk kerja berat (query database, proses file, integrasi SDK yang butuh Node API). Di Next.js kalian bisa campur keduanya dalam satu aplikasi — itulah kekuatan fullstack.
Menandai route handler untuk berjalan di edge cukup dengan runtime export:
export const runtime = "edge"
export async function GET(request: Request) {
const ip = request.headers.get("x-forwarded-for")
const country = request.headers.get("x-vercel-ip-country") ?? "ID"
return Response.json({
message: `Konten dioptimalkan untuk ${country}`,
requestedFrom: ip,
})
}Edge runtime membatasi API yang tersedia: tidak ada process.env akses penuh (hanya env object), tidak ada library native, dan koneksi ke database memakai driver khusus. Yang penting tetap tersedia: Request/Response web standard, crypto, dan fetch.
Middleware adalah warga tetap di edge — ia berjalan di depan setiap request dan cocok untuk logika yang menentukan arah sebelum halaman di-render:
import { NextResponse } from "next/server"
import type { NextRequest } from "next/server"
export function middleware(request: NextRequest) {
const session = request.cookies.get("session")?.value
if (!session && request.nextUrl.pathname.startsWith("/notes")) {
return NextResponse.redirect(new URL("/login", request.url))
}
return NextResponse.next()
}
export const config = {
matcher: ["/notes/:path*"],
}Middleware berjalan di edge untuk semua pengguna — redirect login, geolocation-based redirect, dan A/B testing yang lebih ringan hidup di sini, bukan di halaman.
Ini jebakan terbesar edge: database kalian tidak ada di "setiap lokasi". Koneksi langsung dari edge ke PostgreSQL di satu region tidak lebih cepat — malah berpotensi lambat. Tiga strategi umum:
Dengan Vercel (dan platform serupa), satu deploy menyalakan kode di jaringan global otomatis — kalian tidak mengatur region. Keputusan yang tersisa hanyalah di mana data tinggal:
| Data | Lokasi | Alasannya |
|---|---|---|
| Halaman statis/ISR | CDN global | Melayani dari titik terdekat |
| Fungsi edge | Global | Logika ringan di ujung jaringan |
| Database | Satu region (mis. singapore) | Konsistensi & compliance |
Untuk workload yang benar-benar harus dekat dengan user dan database, model terbaru adalah database distributed (multi-region). Berhati-hatilah: multi-region menambah kompleksitas konsistensi — episode 22 membahasnya lebih dalam. Mulai dari satu region dulu.
Warning
Cold start serverless bukan mitos — ia nyata, tapi untuk Node functions (puluhan–ratusan ms). Untuk logika ringan yang kejadian per request (middleware, redirect), edge menghilangkan masalah ini. Ukur keduanya: jangan asumsikan, ukur dengan x-vercel-* timing headers atau alat observasi.
Selesaikan dengan urutan berikut:
src/middleware.ts.runtime = "edge" yang mengembalikan negara pengunjung dari header.export const runtime = "nodejs").curl -s -o /dev/null -w "%{time_total}s\n" https://aplikasi-kalian.vercel.app/Inti yang harus dibawa pulang:
Di episode 19 selanjutnya kita membahas multi-tenancy & authorization — model organisasi, row-level security, dan kontrol akses yang benar di level data. Sampai jumpa di episode 19!