Skip to content
V3.0 // STABLE
LOAD 12%
LAT 24MS
SLA 99.99%

Distributed Locks dengan Redis & Go

2 min read
3 views
redisdistributed systemsconcurrencygolang

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

Live architecture
Analyzing Schema...

Arch Note

Interactive logic enabled. Click components in expanded view for technical service definitions.

Layer.0 / Distributed_System_Viz

Kesalahan yang Harus Dihindari

  1. Clock Drift (Pergeseran Jam): Sistem terdistribusi tidak memiliki jam yang tersinkronisasi sempurna. Pastikan TTL Anda cukup lama untuk operasi tersebut.
  2. 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.
  3. 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.