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.
Matriks Pemilihan Driver
Section titled “Matriks Pemilihan Driver”| 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 |
1. Driver In-Memory (driver/memory)
Section titled “1. Driver In-Memory (driver/memory)”Driver In-Memory dibuat untuk aplikasi single-node berperforma hyper-tinggi yang tidak memerlukan berbagi status antar-instance server.
Karakteristik Utama
Section titled “Karakteristik Utama”- Arsitektur 64 Shard: Menggunakan hash
fnv32auntuk 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.
Contoh Kode
Section titled “Contoh Kode”import ( "context" "time"
"github.com/balramadan/distlimit/driver/memory")
// Inisialisasi Memory Driver dengan interval pembersihan TTL key 5 menitmemDriver := 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.
Karakteristik Utama
Section titled “Karakteristik Utama”- Skrip Lua Atomik: Evaluasi limit dalam satu eksekusi skrip atomik di Redis.
- Cluster Hash Tags
{}: Format keydistlimit:{key}menjamin eksekusi pada satu hash slot di Redis Cluster. - Aman Fail-Open: Menangani pemutusan koneksi secara aman saat dibungkus dalam middleware.
Contoh Kode
Section titled “Contoh Kode”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 DriverredisDriver := 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.
Karakteristik Utama
Section titled “Karakteristik Utama”- 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.
Contoh Kode
Section titled “Contoh Kode”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 DriverhybridDriver := 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())