Waktu pertama kali belajar bikin bot dan integrasi aplikasi beberapa tahun lalu, pendekatan pertama yang kepikiran di kepala aku sangat sederhana: bikin skrip Python dengan perulangan while True, kasih time.sleep(5), lalu tembak API tujuan terus-menerus buat ngecek apakah ada pesan atau data baru.
Kelihatannya beres dan bekerja normal. Tapi begitu skrip itu dideploy ke server VPS murahan, masalah mulai kelihatan. CPU server naik turun tanpa henti, log terminal penuh dengan ribuan baris request kosong, dan kuota request (rate limit) dari layanan API yang kupakai cepat habis. Itulah momen pertama aku berkenalan dengan konsep Polling dan kenapa ada solusi yang jauh lebih elegan bernama Webhook.
Analogi Gampangnya: Nungguin Kurir Paket
Biar gampang dibayangin tanpa istilah teknis yang ribet, kita pakai analogi nunggu kiriman paket belanja online:
- Polling: Kamu keluar rumah tiap 2 menit sekali, ngetuk pagar tetangga atau pos satpam sambil nanya: "Pak, paket saya udah dateng belum?". 99% jawabannya: "Belum ada, Mas.". Kamu capek bolak-balik, satpamnya juga lama-lama jengkel.
- Webhook: Kamu cuma sekali bilang ke kurir atau satpam: "Pak, ini nomor WhatsApp saya. Nanti kalau paketnya beneran udah nyampe di depan, tolong chat atau telepon saya ya." Setelah itu, kamu bisa santai ngopi atau tidur di kamar. Kamu baru bergerak waktu HP kamu berdering dapat kabar.
Di dunia software, HP yang siap nerima telepon itu adalah URL endpoint di server kamu, dan pesan yang dikirim kurir adalah data berformat JSON.
Melihat Perbedaan Teknisnya
Secara arsitektur jaringan, polling bersifat pull (kita yang narik data secara aktif), sedangkan webhook bersifat push (server sumber yang mendorong data ke kita waktu ada peristiwa nyata).
1. Polling (Request Berulang)
Dalam metode polling tradisional, aplikasi klien memegang kendali waktu. Klien menentukan seberapa sering ia bertanya. Kelemahannya ada dua sisi: kalau intervalnya terlalu lama (misal 5 menit sekali), data jadi terlambat (latency tinggi). Tapi kalau intervalnya terlalu rapat (misal tiap 2 detik), server kita dan server tujuan sama-sama terbebani beban komputasi yang sebenarnya sia-sia.
2. Webhook (Event-Driven)
Dengan webhook, komunikasi berjalan berbasis peristiwa (event-driven). Selama gak ada transaksi baru di payment gateway, atau gak ada push commit baru di repository GitHub kamu, server kamu hening tanpa lalu lintas data yang mubazir. Begitu peristiwa terjadi, server asal langsung mengirimkan HTTP POST request ke alamat URL yang udah kamu daftarkan sebelumnya.
Contoh Nyata: Menerima Webhook dengan Python
Bikin penerima webhook (sering disebut webhook listener) sebenarnya gampang banget. Kamu cuma butuh web framework minimalis seperti FastAPI atau Flask yang membuka satu endpoint HTTP POST. Berikut contoh sederhana menggunakan FastAPI:
from fastapi import FastAPI, Request, HTTPException
import uvicorn
app = FastAPI(title="Webhook Receiver")
@app.post("/api/v1/webhook-handler")
async def receive_webhook(request: Request):
# Ambil payload JSON yang dikirim oleh server pihak ketiga
try:
payload = await request.json()
except Exception:
raise HTTPException(status_code=400, detail="Invalid JSON payload")
event_type = payload.get("event")
data = payload.get("data", {})
print(f"[EVENT MASUK] Tipe: {event_type} | ID Transaksi: {data.get('id')}")
# PENTING: Segera balas dengan HTTP 200 OK
return {"status": "received"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
Catatan Oprekan: Hal Penting yang Sering Terlewat
Waktu mulai beralih ke webhook di proyek skala nyata, ada beberapa jebakan umum yang sering bikin bingung kalau belum pernah ngalamin:
- Wajib Verifikasi Signature (Keamanan): Siapa saja di internet bisa menembak URL endpoint kamu dengan payload palsu kalau URL-nya ketahuan. Penyedia layanan terpercaya (seperti GitHub, Stripe, atau Midtrans) selalu menyertakan header hash (misal
X-Hub-Signature-256). Selalu hitung ulang hash tersebut pakai secret key kamu sebelum memproses datanya. - Segera Kirim Balasan 200 OK: Jangan taruh proses berat (seperti kompresi video, training model, atau eksekusi database lama) langsung di dalam fungsi penerima webhook. Kirim balasan
200 OKdalam hitungan milidetik, lalu lempar pekerjaan berat ke background task (misal Celery, queue, atau thread terpisah). Kalau endpoint kamu kelamaan merespons (timeout), server pengirim biasanya menganggap webhook gagal dan bakal mengulang kirim terus-menerus. - Tangani Idempotency (Event Ganda): Jaringan internet itu gak sempurna. Kadang server pengirim melakukan retry otomatis karena ada koneksi yang tersendat sesaat. Akibatnya, kamu bisa nerima satu notifikasi transaksi yang sama dua kali. Pastikan aplikasi kamu punya pengecekan ID event agar saldo pengguna gak bertambah dobel.
- Trik Testing di Localhost: Waktu ngoding di laptop lokal, server penyedia layanan gak bisa mengakses alamat
localhost:8000kamu secara langsung. Di sinilah alat tunneling seperti Cloudflare Tunnel atau ngrok sangat membantu untuk meminjamkan domain publik sementara ke laptop kamu.
Jadi, Kapan Masih Perlu Pakai Polling?
Apakah webhook selalu lebih unggul dari polling? Gak selalu. Ada situasi tertentu di mana polling justru adalah pilihan yang paling realistis dan tepat:
- Layanan pihak ketiga memang gak menyediakan fitur webhook sama sekali di dokumentasi API mereka.
- Aplikasi kamu berada di jaringan tertutup (intranet atau perangkat edge tanpa IP publik) yang mustahil membuka port ke internet luar.
- Sinkronisasi data hanya dibutuhkan dalam frekuensi sangat rendah, misalnya backup database otomatis tiap tengah malam sekali.
Masing-masing punya tempatnya sendiri. Tapi kalau urusannya adalah notifikasi real-time, event pembayaran, atau bot chat otomatis, webhook jelas cara paling efisien dan ramah resource buat server kamu.
Kolom Komentar (0)
Silakan tinggalkan tanggapan atau pertanyaan Anda pada formulir di bawah ini.