Serverless vs Edge Functions
Penjelasan perbedaan serverless function dan edge function: lokasi eksekusi, cold start, batas runtime, dan cara memilih yang tepat untuk tiap kebutuhan.
Keduanya menjalankan kodemu tanpa kamu mengurus server. Perbedaannya ada di di mana kode itu berjalan, dan konsekuensi dari perbedaan itu ternyata cukup besar.
| Serverless function | Edge function | |
|---|---|---|
| Berjalan di | Satu atau beberapa region | Ratusan lokasi di dunia |
| Runtime | Node.js penuh | Terbatas, mirip browser |
| Waktu mulai | Puluhan sampai ratusan ms | Nyaris seketika |
| Durasi jalan | Detik sampai menit | Sangat singkat |
| Akses database | Mudah | Terbatas |
Serverless function
Fungsi ini berjalan di pusat data yang sesungguhnya — mesin dengan Node.js lengkap, di satu region yang kamu atau platformmu pilih.
Yang membuatnya "serverless" bukan ketiadaan server, melainkan kamu tidak mengurusnya. Function hidup saat ada permintaan, lalu mati. Kamu tidak menjaga apa pun tetap menyala.
Kelebihannya: kamu punya Node.js penuh. Modul fs, crypto, driver database, library berat — semuanya jalan. Bisa berjalan cukup lama untuk pekerjaan yang serius.
Kekurangannya: ada cold start. Kalau function-mu tidak dipanggil beberapa saat, permintaan berikutnya harus menunggu lingkungannya disiapkan dulu. Dan karena berjalan di satu region, pengunjung dari benua lain menanggung waktu tempuh jaringan.
Edge function
Fungsi ini berjalan di lokasi CDN — ratusan titik di seluruh dunia, sedekat mungkin dengan pengunjung.
Supaya bisa dijalankan di begitu banyak tempat sekaligus, runtime-nya dipangkas. Yang tersedia lebih mirip lingkungan browser daripada Node.js: fetch, Request, Response, Web Crypto. Bukan fs, bukan modul Node.
Kelebihannya: mulai nyaris seketika, tanpa cold start yang terasa. Dan karena berjalan dekat pengunjung, waktu tempuh jaringannya kecil.
Kekurangannya: banyak library tidak jalan. Waktu eksekusinya sangat terbatas. Dan memanggil database jadi rumit — database-mu ada di satu tempat, sementara function-mu di mana-mana, jadi keuntungan kedekatannya sering hilang lagi.
Orang memindahkan function ke edge demi kecepatan, lalu function itu memanggil database yang ada di Virginia. Hasilnya justru lebih lambat: dulu satu perjalanan jauh, sekarang tetap satu perjalanan jauh ditambah lapisan tambahan. Edge cuma menang kalau datanya juga ada di dekat sana, atau kalau tidak butuh data sama sekali.
Cara memilih
Pakai edge function untuk
- Redirect berdasarkan lokasi atau bahasa. Keputusannya cepat, datanya ada di header permintaan.
- A/B testing. Membagi lalu lintas antar-varian.
- Pemeriksaan autentikasi ringan. Memeriksa keberadaan cookie sebelum meneruskan permintaan.
- Menulis ulang atau menambah header.
- Personalisasi sederhana yang tidak butuh database.
Pakai serverless function untuk
- Query database. Driver database umumnya butuh Node.js.
- Memanggil API dengan kunci rahasia.
- Memproses gambar atau berkas.
- Mengirim email.
- Menerima webhook dari layanan lain.
- Apa pun yang butuh library Node.
Aturan praktisnya: mulai dari serverless. Pindahkan ke edge hanya kalau kamu mengukur dan menemukan latensi jadi masalah nyata, dan kode itu memang tidak butuh apa-apa dari Node.
Di tiap platform
| Platform | Serverless | Edge |
|---|---|---|
| Vercel | Runtime Node.js | Runtime Edge |
| Netlify | Netlify Functions | Edge Functions |
| Cloudflare | Workers — satu model untuk keduanya | |
Cloudflare posisinya berbeda. Workers memang dirancang berjalan di edge sejak awal, tapi sekarang menyediakan lapisan kompatibilitas Node.js lewat flag nodejs_compat. Jadi kamu mendapat jangkauan edge dengan sebagian besar kenyamanan Node — dengan batas waktu CPU yang tetap ketat.
Contoh: memilih runtime di SvelteKit
// svelte.config.js
import adapter from '@sveltejs/adapter-vercel';
export default {
kit: {
adapter: adapter({
runtime: 'nodejs22.x' // atau 'edge'
})
}
};
Di Next.js, per rute:
// Bawaan: Node.js
export const runtime = 'nodejs';
// Pindah ke edge
export const runtime = 'edge';
Baris kedua itu yang sering dipasang orang tanpa alasan jelas, lalu bingung kenapa library-nya berhenti jalan. Kalau kamu tidak punya alasan spesifik, jangan pasang.
Soal cold start
Cold start sering dibesar-besarkan. Untuk situs biasa dengan lalu lintas wajar, function-mu tetap hangat sebagian besar waktu, dan pengunjung jarang merasakannya.
Yang lebih berpengaruh justru ukuran bundle function-mu. Function yang mengimpor library besar butuh waktu lebih lama untuk siap. Dua hal yang membantu:
- Impor hanya bagian yang dipakai —
import { format } from 'date-fns', bukan seluruh paket. - Pastikan paket yang hanya dibutuhkan saat build ada di
devDependencies, bukandependencies.
Cara paling murah: jangan panggil function sama sekali
Ini yang sering terlewat dalam perdebatan serverless lawan edge.
Halaman yang dirender saat build tidak memanggil function apa pun. Nol latensi, nol cold start, nol biaya. Sebelum memikirkan runtime mana yang lebih cepat, tanyakan dulu apakah halaman itu benar-benar perlu dirender per permintaan.
Sering kali jawabannya tidak, dan yang kamu butuhkan cuma ISR — halaman dari cache yang dibangun ulang berkala. Penjelasannya di SSG vs SSR vs CSR.
Ringkasan
| Kalau kodemu... | Pakai |
|---|---|
| Memanggil database | Serverless |
| Butuh library Node | Serverless |
| Memproses berkas atau gambar | Serverless |
| Cuma membaca header dan mengarahkan | Edge |
| Membagi lalu lintas untuk A/B testing | Edge |
| Tidak butuh data sama sekali | Edge |
| Menghasilkan halaman yang sama untuk semua | Tidak perlu function |
Untuk memahami kenapa lokasi eksekusi berpengaruh sebesar itu, lihat apa itu CDN dan edge network. Untuk gambaran arsitekturnya, lihat apa itu Jamstack.