Lewati ke konten

Perbandingan Storage Driver

distlimit mengabstraksikan status penyimpanan di balik interface distlimit.Driver. Pemilihan driver bergantung pada topologi deploy, budget latensi, dan kebutuhan ketersediaan sistem Anda.


Driver Topologi Deploy Overhead Latensi Persistensi Data Toleransi Kegagalan Sangat Cocok Untuk
Memory Single Instance / Edge Sub-mikrodetik (200 ns) Tidak (Efemer) Tinggi (Proses lokal) Monolit, microservices limit lokal, edge proxy
Redis Multi-node Cluster Rendah (1 - 3 ms) Ya (Terkonfigurasi) Tergantung Cluster Redis Rate limiting terdistribusi global antar-replika
Hybrid Cluster High-Availability Sub-mikrodetik / Rendah Parsial (Primary Redis) Ekstrem (Half-Open Circuit Breaker) API misi kritis, payment gateway, microservices zero-downtime

Driver In-Memory dibuat untuk aplikasi single-node berperforma hyper-tinggi yang tidak memerlukan berbagi status antar-instance server.

  • Arsitektur 64 Shard: Menggunakan hash fnv32a untuk membagi lock key ke dalam 64 mutex.
  • Zero Allocation: Rutin evaluasi mencapai overhead memori 0 B/op.
  • Pembersihan TTL Otomatis: Key rate limit yang kedaluwarsa dibersihkan secara otomatis di latar belakang sesuai interval yang dikonfigurasi.
import (
"context"
"time"
"github.com/balramadan/distlimit/driver/memory"
)
// Inisialisasi Memory Driver dengan interval pembersihan TTL key 5 menit
memDriver := memory.New(5 * time.Minute)
defer memDriver.Close(context.Background())

2. Distributed Redis Driver (driver/redis)

Section titled “2. Distributed Redis Driver (driver/redis)”

Driver Redis terhubung ke instance Redis eksternal (Standalone, Sentinel, atau Cluster) menggunakan go-redis/v9.

  • Skrip Lua Atomik: Evaluasi limit dalam satu eksekusi skrip atomik di Redis.
  • Cluster Hash Tags {}: Format key distlimit:{key} menjamin eksekusi pada satu hash slot di Redis Cluster.
  • Aman Fail-Open: Menangani pemutusan koneksi secara aman saat dibungkus dalam middleware.
import (
"context"
distlimitredis "github.com/balramadan/distlimit/driver/redis"
"github.com/redis/go-redis/v9"
)
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
// Inisialisasi Redis Driver
redisDriver := distlimitredis.New(rdb)
defer redisDriver.Close(context.Background())

3. Dual-Tier Hybrid Driver (driver/hybrid)

Section titled “3. Dual-Tier Hybrid Driver (driver/hybrid)”

Driver Hybrid memberikan ketahanan tingkat enterprise dengan melapisi Driver Redis Utama di atas Driver Fallback In-Memory.

  • Failover Otomatis: Jika Redis gagal, request beralih ke memori secara instan tanpa mengembalikan error atau memblokir trafik.
  • Cool-Off Circuit Breaker: Window cool-off terkonfigurasi (misal 5s) mencegah banjir trafik ke node Redis yang sedang pulih.
  • Half-Open Probing Atomik: Menggunakan lock CompareAndSwap (CAS) sehingga hanya 1 request yang menguji Redis saat cool-off berakhir.
  • Callback Failover (WithOnError): Memicu hook alert (misal Slack, PagerDuty, metrik Prometheus) saat Redis drop.
import (
"context"
"log"
"time"
distlimithybrid "github.com/balramadan/distlimit/driver/hybrid"
distlimitmemory "github.com/balramadan/distlimit/driver/memory"
distlimitredis "github.com/balramadan/distlimit/driver/redis"
"github.com/redis/go-redis/v9"
)
rdb := redis.NewClient(&redis.Options{Addr: "localhost:6379"})
primary := distlimitredis.New(rdb)
fallback := distlimitmemory.New(5 * time.Minute)
// Konfigurasi Hybrid Driver
hybridDriver := distlimithybrid.New(
primary,
fallback,
distlimithybrid.WithCoolOffDuration(5*time.Second),
distlimithybrid.WithOnError(func(err error) {
log.Printf("[ALERT] Redis primary down, beralih ke memory: %v", err)
}),
)
defer hybridDriver.Close(context.Background())