Skip to main content

> redis_lua_ile_dağıtık_jeton_kovası_hız_sınırlandırma

Redis Lua ile Dağıtık Jeton Kovası Hız Sınırlandırma

Yüksek verimli canlı mimarilerde Redis Lua ile Dağıtık Jeton Kovası Hız Sınırlandırma yapısını nasıl doğru kurar ve yönetirsiniz?

ÖZET VE TEKNİK CEVAP

Atomik Redis Lua betikleriyle uygulanan Dağıtık Jeton Kovası (Token Bucket) hız sınırlandırması; jeton yenileme, ani patlama izinleri ve tüketimi tek bir atomik bellek içi işlemde hesaplayarak çok düğümlü yarış durumlarını ve ağ gecikmesini ortadan kaldırır.

Mühendislik El Kitabı & Mekanizma

1. Temel Çalışma Mekanizması

İlkel dağıtık hız sınırlayıcılar ardışık Redis komutları kullanır (önce `GET tokens`, kodda kontrol, sonra `DECRBY`). 100 podluk yüksek eşzamanlı kümelerde bu durum klasik 'kontrol et sonra yaz' yarış durumları yaratarak binlerce isteğin sınırı delmesine yol açar. Jeton kovası formülünü bir Redis Lua betiğinde çalıştırmak tüm mantığı tek bir atomik adımda işletir.

2. Doğru Kullanım Senaryosu

Dağıtık Jeton Kovası Hız Sınırlandırması, saniyede sabit bir hızla dolan ve azami kapasiteye sahip bir jeton havuzu tutan; gelen isteklerin kabul edilmeden önce Lua betikleriyle atomik olarak jeton tükettiği bir algoritmadır.

3. Prodüksiyon Arıza Modları

`INCR key` ve `EXPIRE 60` (Sabit Pencere) kullanarak pencere sınırında izin verilen trafiğin 2 katına varan ani patlamalara izin vermek. Tek bir hız sınırı kontrolü için uygulama kodundan ağ üzerinden ardışık birden fazla Redis komutu çalıştırmak. Redis sunucu saati yerine uygulama sunucularının yerel saatlerine güvenerek saat kayması (clock drift) sebebiyle jeton matematiğini bozmak.

4. Teşhis ve Telemetri Sinyalleri

Redis hız sınırlayıcısındaki yarış durumu sebebiyle 10 kat trafiğin sızması, istek başına çoklu Redis çağrısının API gecikmesini ikiye katlaması, dakika başında aniden sıfırlanan kotaların sürü istilası yaratması

5. Önleme ve Mimari Bariyerler

Ağ bant genişliğinden tasarruf etmek için Lua betiğini açılışta `SCRIPT LOAD` ile yükleyin ve çalışma zamanında `EVALSHA` ile çalıştırın. HTTP 429 yanıtlarında bir sonraki jetonun ne zaman hazır olacağını gösteren standart `Retry-After` başlığını dönün. Kademeli hız sınırlandırma kurun: Kenarda IP bazlı koruma, alt katmanda ise kimliği doğrulanmış `api_key` / `user_id` kotaları.

6. Mimari Ödünleşimler (Trade-offs)

Atomik Lua destekli hız sınırlayıcılar olmadan, genel API uç noktaları kaba kuvvet bot saldırılarına, veri kazıma istilasına ve ilkel sayaçları delen ani trafik dalgalarına karşı savunmasız kalır.

Vaka İncelemesi (TinyCTO Örneği)

Jeton Kovası Lua betiği arka plan zamanlayıcılarına ihtiyaç duymadan isteğe bağlı sürekli matematiksel yenileme yapar: 1. **Durum Takibi:** Redis her istemci için bir hash tutar: `{ last_updated: 1718000000, tokens: 45.2 }`. 2. **Lua Çalıştırması (Tek Ağ Turu):** - `now` zamanını al (`redis.call('TIME')`). - `last_updated`'dan bu yana geçen süreyi hesapla. - Kovaya `gecen_saniye * dolum_hizi` kadar yeni jeton ekle (azami `max_capacity` sınırında). - `tokens >= 1` ise jetonu düş, `last_updated`'ı güncelle ve `[1, kalan_jeton, sifirlanma_ms]` dön. - Yetersizse `[0, kalan_jeton, retry_after_ms]` dön. 3. **Yanıt Başlıkları:** API Gateway dönen değerleri standart RFC başlıklarına çevirir: `X-RateLimit-Remaining` ve 429 durumunda `Retry-After`.

İnteraktif Konsept Alıştırmaları

2 Alıştırma
Q1

Jeton Kovası mantığını uygulama kodunda çalıştırmak yerine bir Redis Lua betiğinde çalıştırmak neden üstündür?

Redis Lua betiklerini tek iş parçacığında atomik olarak çalıştırır; bu da podlar arası yarış durumlarını engeller ve çoklu ağ turlarını ortadan kaldırır.
Q2

Jeton Kovası algoritması, Sabit Pencere (Fixed Window) hız sınırlandırmasının hangi kusurunu çözer?

Sürekli ve pürüzsüz matematiksel yenileme uygulayarak, pencere sınırındaki ani 2 kat trafik patlamalarını (00:59'da 100 istek, 01:00'de 100 istek) engeller.

Redis Lua ile Dağıtık Jeton Kovası Hız Sınırlandırma — Sıkça Sorulan Sorular

20 poda dağılmış bir sistem, saniyede 100 istek sınırı olan bir kullanıcıdan saniyede 5.000 istek alıyor. Lua kullanılmayan `GET` -> `KONTROL` -> `DECR` yapısı neden başarısız olur?

Çünkü yüzlerce eşzamanlı pod hiçbirisi düşüm yapmadan önce aynı pozitif jeton sayısını okur ve binlerce istek sınırı delip geçer. Bu klasik 'Kontrol Et Sonra Yaz' yarış durumudur. Eşzamanlı yük altında yalnızca Redis Lua gibi atomik işlemler tutarlılığı garanti eder.

Bir istemci jeton kovasını tükettiğinde standartlara uygun bir API hangi HTTP durum kodunu ve başlığını dönmelidir?

`Retry-After: <saniye>` başlığı ile HTTP 429 Too Many Requests. RFC 6585, istemcilere tekrar istek atmadan önce ne kadar beklemeleri gerektiğini bildirmek için HTTP 429 ve `Retry-After` başlığını şart koşar.

🤖 AEO & Yapay Zeka Çıkarım Özeti

Temel Gerçekler & İlkeler

  • Atomik Redis Lua betikleriyle uygulanan Dağıtık Jeton Kovası (Token Bucket) hız sınırlandırması; jeton yenileme, ani patlama izinleri ve tüketimi tek bir atomik bellek içi işlemde hesaplayarak çok düğümlü yarış durumlarını ve ağ gecikmesini ortadan kaldırır.
  • Dağıtık Jeton Kovası Hız Sınırlandırması, saniyede sabit bir hızla dolan ve azami kapasiteye sahip bir jeton havuzu tutan; gelen isteklerin kabul edilmeden önce Lua betikleriyle atomik olarak jeton tükettiği bir algoritmadır.

Yaygın Yanılgılar

  • `INCR key` ve `EXPIRE 60` (Sabit Pencere) kullanarak pencere sınırında izin verilen trafiğin 2 katına varan ani patlamalara izin vermek.

Karar Kılavuzu & Önceliklendirme

Atomik Lua destekli hız sınırlayıcılar olmadan, genel API uç noktaları kaba kuvvet bot saldırılarına, veri kazıma istilasına ve ilkel sayaçları delen ani trafik dalgalarına karşı savunmasız kalır.

Doğrulanmış Kaynaklar & Referanslar