Rate Limiting Kavramını ve Algoritmalarını Anlamak

Rate Limiting, sıklıkla arka plan servisler ve API ile çalışanların duyabileceği bir kavramdır. İster geliştirici olun ister son kullanıcı olun, 429 hata kodu ile bir uyarı gördüğünüzde yapabileceğiniz istek sınırına ulaşmış olup, daha fazlasına izniniz yok demektir. Bunu yapan rate limiting'dir.

Client Server Rate Limiting İlişkisi

Belirli bir zaman diliminde; uygulamaya yapılan istek sayılarının sınırlandırılmasıdır ve bu amaçla uygulanan algoritmalar bulunur.

Güvenlik, kaynakların doğru yönetimi, uygulamanın çökmesini engelleme ve sunucu trafiğinin kontrol altına alınması yönünden kritik bir konudur.

Programlama dillerinde ve frameworklerde, yazımda belirtilen algoritmalar kullanılarak çalışmalar mevcuttur.

Sıklıkla kullanılan ve temel olarak 4 farklı algoritmaya sahiptir.

Token Bucket

Bu algoritmada, belirli bir periyotta belirli bir sayıda istek yapabileceğini belirleriz. Kafamızda canlanması açısından;

  • Token, istekleri; 
  • Bucket, kovaları 
  • Token Bucket, isteklerin tutulduğu kovaları belirtir.

Örnek senaryoda;


  • 1 dakikada kullanıcının kovasında 5 istek bulunur. 
  • Her istek yapıldığında, kovasından 1 istek azalır. 
  • Eğer 1 dakika geçmeden sıfıra düşerse, istekten cevap alamaz. İstek kovasının güncellenmesini beklemek zorundadır. Örnek görselde 45. saniyede istek limitine ulaştığı için 429 hata kodunu görür. 15 saniye sonra tekrar istek yapabilir durumdadır.
  • 1 dakika sonrasında istek kovası yenilenerek 5 isteğe çıkar. 
Dağıtık sistemlerde ani sıfırlamadan kaynaklı sorun olmaması için istek yenileme süresi ile istek sınırını iyi dengelememiz gerekir. 

Buna uygun örnek senaryoda; 

6 saniyede 10 istek yapıldı. 1 dakika sonrasındaki yeniden doldurulma anına denk geldiği için bu şekilde trafik oluştu. En iyi çözüm olarak 60/5 hesabıyla 12 saniyede bir istek kovasını yeniden doldurarak muhtemel sorundan kurtulabiliriz.

Leaky Bucket

Çatlak kova/sızdıran kova olarak da bilinen bu algoritmada; istekler, kuyruk düzeninde toplanır. FIFO (first in - first out) mantığı ile düzenli aralıklarla istekler işlenir. Kuyruk kapasitesi dolduğunda yeni bir istek, kuyruğa kabul edilmez. Kuyruktaki isteklerin işlenmesi beklenir. 


Görselleştirdiğim örnekte rate limiting tekniğini uyguladığımız kuyruğun kapasitesi 4 istekle sınırlıdır. Belirlenmiş bir zaman aralığında işlenir sonra kuyruğun sonuna yeni bir istek alınır. Eğer kuyruk doluyken istek gelirse engellenir. 

Token Bucket algoritmasına göre avantajı, isteklerin sabit bir zaman aralığında düzenli olarak işlenmesidir. Token Bucket algoritmasında kullanıcı 60 saniyedeki yenileme süresine gelmeden 59. saniyede kovadaki bütün istekleri yapar ve sunucu üzerinde bir trafik artışına neden olur.

Fixed Window

Sabit pencere adı verilen bu algoritmada en önemli elemanlar, sabit zaman aralığı penceresi ve maksimum istek adetini belirten sayaçtır. Sabit zaman aralığında istek limitine ulaşıldığında, bir sonraki zaman penceresine kadar gelen istekler reddedilecektir. Bunu aşağıdaki görselle daha iyi anlayabiliriz.


Örnekte; 60 saniyelik sabit pencere var ve her pencerede en fazla 3 istek karşılanabilir. Özetle dakikada 3 istek karşılanabilir. 

0-60 sn penceresi = 2 istek yapılmış ve engellenen istek yok.

60-120 sn penceresi = 3 istek yapılmış ve maksimum istek sayısına ulaşıldı.

120-180 sn penceresi = 4 istek yapılmış ve ilk 3 istekten sonraki 4. istek, maksimum isteğe ulaşıldığı için engellendi. Yeni bir istek yapılabilmesi için bir sonraki pencereyi beklemek zorundadır. 

 Fixed Window kullanıldığında karşılaşılabilecek sorunlar;

  • Ardışık iki zaman penceresi sınırında yapılacak yoğun isteklerde, trafik artışına yol açabilir. Bu yönüyle Token Bucket algoritmasına benzer.
  • Zaman penceresinin başında maksimum istek sınırına ulaşıldığında bir sonraki zaman penceresini beklemek için uzun süre bekleyebilir. Tamamen zaman penceresinin süresinin uzunluğuna bağlıdır.

Fixed Window ile Token Bucket arasındaki en önemli fark; 

Token Bucket algoritmasında yeniden doldurulma oranı (refill rate) yenileme süresi/istek kapasitesine göre ayarlanabilirken, Fixed Window algoritmasında yeniden doldurulma oranı sabittir.

Sliding Window

Fixed Window algoritmasından farklı olarak; bu algoritma, istekleri sabit bir zaman penceresinde sınırlamaz. Gelen istekler, istek zamanıyla birlikte bir dizi yapısında tutulur. 

Örnek senaryoda; 1 dakikada 4 isteği kabul edecek bir sınırlamamız var. İstek geldiğinde, son 1 dakikada gelen istekler kontrol edilir. İstek sınırına ulaşılmadıysa diziye eklenir. 

Görselde ilk istek (Request 1) 0:01'de anında ve yeni istek (Request 5), 1:02'de geldi. Gelen istek sonrası dizide dolaşıldıktan sonra 5. istek, 1:02 anında 3 isteğe düştüğü için işlenmek üzere diziye dahil edildi. 

Dezavantaj olarak; gelen her yeni istekte dizide döngü yapılacağı için bellek ve CPU tüketimi fazla olacaktır.

Özetle,

Rate limiting algoritmaları, sistem tasarımında güvenlik, kaynak yönetimi ve sunucu/uygulama trafiği yönünden önemli bir tekniktir, kendi içinde avantaj ve dezavantajlara sahiptir. Uygulamalarınıza göre algoritma seçimi yapılabilir. 

Keyifli ve faydalı olmasını umarak, çalışmalarınızda kolaylıklar diliyorum.

Yazımı yazarken incelediğim kaynaklar,

Yorumlar