Cara kerja token-bucket rate limiter
Rate limiting itu salah satu hal "boring" yang diam-diam nyelametin production lo. Tanpa itu, satu bot atau satu bug retry-loop bisa nge-flood endpoint lo sampai tumbang. Di reliakit gua bikin yang model token bucket. Ini cara kerjanya.
Masalahnya
Lo mau batasin sesuatu kayak: "boleh rame sebentar, tapi jangan terus-terusan." Bukan "5 request per menit" yang kaku (itu fixed-window โ ada masalah burst di batas window). Token bucket lebih halus.
Token bucket, sesimpel ember
Bayangin ember:
- Ember muat 5 token (kapasitas).
- Tiap request ambil 1 token. Ada token โ jalan. Kosong โ ditolak.
- Token diisi ulang pelan-pelan (misal 1 token tiap 2 detik).
Jadi lo bisa burst sampai 5 sekaligus (pas ember penuh), terus setelahnya kecepatannya dibatasi sama laju isi ulang. Pas buat trafik yang wajar bursty, tapi tetap ada batas rata-ratanya.
API-nya
Di reliakit, rate limiter-nya kayak gini:
use RateLimiter;
// kapasitas 5, isi ulang 1 token tiap 2 (satuan waktu)
let mut limiter = new;
if limiter.try_acquire_one else
new(capacity, refill_amount, refill_interval), terus try_acquire_one(now)
yang balikin bool. Udah, segitu doang.
Yang bikin enak: clock-agnostic
Perhatiin now itu lo yang kasih. Limiter-nya gak baca jam sendiri, gak ada
background thread, gak ada SystemTime::now() di dalemnya. Kenapa ini bagus?
Karena jadi gampang dites & deterministik. Lo yang pegang waktunya:
let mut rl = new;
// "detik" 0: ada 2 token, abisin
assert!;
assert!;
assert!; // kosong โ ditolak
// "detik" 1: keisi 1 token lagi
assert!;
Gak ada sleep, gak ada flaky test. Lo "majuin waktu" sesuka lo. Bonus: karena
gak nempel ke clock OS, dia no_std + zero-dependency โ bisa jalan di mana
aja, termasuk WASM.
Coba langsung di browser
Karena dia jalan di mana aja, gua compile ke WASM dan taruh di playground di halaman Proyek. Pencet tombolnya cepet-cepet: 5 klik pertama lolos, sisanya ditolak, terus token-nya keisi lagi pelan-pelan. Rate limiter beneran, jalan di browser lo โ bukan video, bukan screenshot.
Penutup
Token bucket itu simpel tapi pas: izinin burst, batasin laju rata-rata. Dan dengan bikin clock-agnostic, lo dapet satu hal yang sering kebuang โ rate limiter yang gampang dites. Kodenya ada di GitHub.