Distributed Locks dengan Redis & Go
Dalam sistem terdistribusi, beberapa instance dari sebuah layanan mungkin mencoba mengakses sumber daya bersama secara bersamaan. Mutex biasa hanya berfungsi dalam satu proses. Untuk keamanan terdistribusi, kita membutuhkan Distributed Locks (Kunci Terdistribusi).
Masalah Race Condition
Bayangkan sebuah acara promosi di mana hanya 10 pengguna yang dapat mengklaim kupon dengan waktu terbatas. Jika dua instance server memeriksa jumlah pada milidetik yang sama, mereka berdua mungkin melihat count=9 dan mengeluarkan dua kupon, yang mengakibatkan pemenuhan berlebihan.
Implementasi dengan Redis (SETNX)
Cara paling umum untuk mengimplementasikan kunci di Redis adalah dengan menggunakan perintah SET dengan NX (Set if Not Exists - Set Jika Tidak Ada) dan PX (Expiration in milliseconds - Kedaluwarsa dalam milidetik).
// Acquire Lock (Dapatkan Kunci)
lockKey := "lock:coupon_claim_123"
requestID := uuid.New().String()
ttl := 5 * time.Second
ok, err := rdb.Set(ctx, lockKey, requestID, ttl).Nx().Result()
if err != nil || !ok {
return fmt.Errorf("could not acquire lock")
}
// Ensure Release with Lua (Atomicity) (Pastikan Rilis dengan Lua (Atomisitas))
defer func() {
var luaScript = `
if redis.call("get", KEYS[1]) == ARGV[1] then
return redis.call("del", KEYS[1])
else
return 0
end
`
rdb.Eval(ctx, luaScript, []string{lockKey}, requestID)
}()Alur Kunci Tingkat Tinggi
Arch Note
Interactive logic enabled. Click components in expanded view for technical service definitions.
Kesalahan yang Harus Dihindari
- Clock Drift (Pergeseran Jam): Sistem terdistribusi tidak memiliki jam yang tersinkronisasi sempurna. Pastikan TTL Anda cukup lama untuk operasi tersebut.
- Lock Timeout (Waktu Tunggu Kunci): Jika proses membutuhkan waktu lebih lama dari TTL, kunci akan dirilis secara otomatis saat proses masih berjalan. Gunakan pola "Watchdog" untuk memperbarui kunci secara berkala.
- Redlock Algorithm (Algoritma Redlock): Untuk kunci yang penting, gunakan algoritma Redlock yang mengharuskan perolehan kunci dari beberapa node Redis independen untuk memastikan keamanan bahkan jika sebuah node gagal.
Menggunakan distributed locks dengan benar sangat penting untuk menjaga integritas data dalam arsitektur backend modern.