Hızlandırmayı ve Network Trafik Kontrolündeki Önemini Anlamak
Hesaplamak, müşteriler ve sunucular arasındaki ağ taleplerini yönetmek için temel bir tekniktir.Bir müşterinin belirli bir süre içinde pencere, fiyat sınırlaması, kaynak egzozunu önlemek, gecikmeli akışları azaltmak ve tüm kullanıcılar için adil erişim sağlamak. C, bir oran limitçinin performansa dikkat etmesi, yeterliliği ve düşük seviyeli bir sistem etkileşimlerine kısıtlaması gerekir.Bu makale, C'de sağlam bir oran limitleyicisi oluşturmak için çok ayrıntılı bir kılavuz sağlar.
Hızlandırmaya İhtiyacı
Hız limitsiz, tek bir yanlış müşteri veya aniden trafik dalgalanması bir sunucuyu aşırı devre dışı bırakabilir. API ağ geçidi gibi uygulamalar, web sunucuları ve gerçek zamanlı hizmetler, geri dönüş kaynaklarını korumak ve hizmet kalitesini korumak için sınırlanabilir. Örneğin, bir doğrulama uç noktası IP kara listeleme ve trafik şekillendirme gibi diğer savunmaları önlemek için giriş girişimleri sınırlandırabilir.
Common Rate Limiting Algorithms
Farklı algoritmaların doğru ve hafıza kullanımı arasındaki ticarete ilişkin teklifler sunar. Bu seçenekleri anlamak, geliştiricilerin belirli kullanım durumlarına doğru yaklaşımı seçmelerine yardımcı olur.
Hediyelik
Token kova algoritması en popüler olanlardan biridir. Bir kova sabit sayıda jeton tutar.Her istek bir token kullanılır; Jetss tam olarak bir araya geldiğinde, kotanın boş olduğu zaman, istekler reddedilir.It algorithmT:0.Wikipedia on toparça oranına kadar.
Leaky
Sıkça Sorulan Sorular tam olarak işlem yapılırsa, yeni talepler düşer.Bu düzgün işlem sırasında Leaky kova sık sık sık sık sık sık sık kullanılan ağ arabirimleri için kullanılabilir.Incoming requests are kuyruk or a counter with a timestamp track the last processed.
Sabit Pencere Counter
Bu en basit yaklaşımdır: Boş pencerelere zaman ayır (örneğin, bir dakika) ve pencere sıfırlamalarından önce taleplerin bir patlamasını aşabilirse, aşağıdaki istekler kısa bir süre boyunca izin verilen ücretin tamamını kolayca yerine getirir.
Pencere Girişi
Bu yöntem her istek için zaman çizelgesine sahiptir (veya müşteri). Yeni bir istek geldiğinde, pencere süresinden daha eski notları kaldırın, sonra kalan sayının limitin altında olup olmadığını kontrol edin.Çok doğru ama hafızaya yoğundur, çünkü C'de bir kez notu depolar veya bağlantılı liste verimli bir şekilde kullanılabilir.
Pencere Counter
Sabit pencereleri interpolasyonla birleştiren optimize edilmiş bir versiyon: Mevcut pencere için bir tane ve daha önceki pencere için bir tane. Etkili oran her zamantamp olmadan sınır problemini azaltmaktadır.Bu algoritma, popüler API ağ geçitlerinde bulunanlar da dahil olmak üzere, bu yaklaşımı kullanarak iyi bir denge sunar.
C C C)'de bir fiyat limiti tasarlayın
C'de bir oran limiteri inşa etmek, devlet yönetimi, zaman işleme ve iplik güvenliği konusunda dikkatli bir tasarım gerektirir. Sonraki bölümler pratik bir uygulama yoluyla yürür.
Temel Prensipler: Devlet, Pencere ve Karar Mantık
Her oran limiter müşteri veya küresel olarak en az üç parça devlet tutmak gerekir: bir istek sayacı, pencerenin başlangıcını ve yapılandırılmış limiti işaretlemek. sabit pencere için karar mantığı basit:
- Mevcut zaman eksi pencere başlangıç, pencere büyüklüğüne veya eşitse, karşıyı sıfırlayın ve pencereyi güncelleyin.
- Eğer karşıt sınır, artımlı ve isteke izin verirse; aksi takdirde bunu inkar edin.
Bu model orijinal token-bucket benzeri örnekte görünüyor, ancak makale yanlış bir şekilde onu bir token kova etiketini etiketlerle karşı karşıya bırakıyor. Aslında atom operasyonları kullanılarak sabit bir pencere sayacı.
Sik ve doğruluk arasında seçim
Birçok uygulama için, sabit bir pencere sayacı yeterlidir. Yüksek çözünürlük gereksinimleri için (örneğin, finansal API veya 5XX-rate limitli), bir sabit pencere logunu veya pencere sayacını uygulama olarak düşünün.
Kod Örnek: Atom Operasyonları ile Sabit Pencere
Aşağıdaki uygulama orijinali dinamik bir limit parametre ekleyerek genişletir ve saat monotonluğu kullanarak doğru bir şekilde çalışır:0) Ayrıca birden çok müşteriyi yönetmek için basit bir hash masası içerir (bir dizi ayar ile sabit).
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdatomic.h>
#include <string.h>
typedef struct {
atomic_ullong request_count;
struct timespec window_start;
} RateLimiter;
// Returns 1 if the request is allowed, 0 otherwise.
int allow_request(RateLimiter *rl, unsigned long long limit, unsigned long long window_sec) {
struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now); // monotonic avoids clock adjustments
// Check if window has expired
if (now.tv_sec - rl->window_start.tv_sec >= window_sec) {
// Reset atomically - careful: window_start is not atomic, but we use a double‑check lock or re‑read
rl->window_start = now;
atomic_store_explicit(&rl->request_count, 0, memory_order_release);
}
unsigned long long count = atomic_load_explicit(&rl->request_count, memory_order_acquire);
if (count < limit) {
atomic_fetch_add_explicit(&rl->request_count, 1, memory_order_relaxed);
return 1;
}
return 0;
}
// Example: rate limiter for a single global endpoint
int main() {
RateLimiter rl = {0, {0, 0}};
const unsigned long long LIMIT = 10;
const unsigned long long WINDOW = 1; // 1 second
for (int i = 0; i < 15; i++) {
if (allow_request(&rl, LIMIT, WINDOW))
printf("Request %d: allowed\n", i+1);
else
printf("Request %d: denied\n", i+1);
struct timespec ts = {0, 100000000}; // 0.1 sec sleep
nanosleep(&ts, NULL);
}
return 0;
}
Bu sürüm, sistem saati değişiklikleri ile ilgili sorunlardan kaçınmak içinFLENT:2 kullanır. Pencere sıfırlama mantığı tamamen atom değildir: Birden fazla konu, süresiz durumu görecek olursa pencereyi aynı anda sıfırlayabilir. Üretimde, bir mutex veya karşılaştırma-ve-swap döngüsü ile sıfırı koruyacaktır.
Kısıtlama ve Thread Safety
Modern ağ sunucuları genellikle çoklu ipliklerde işlem talep eden veya çok fazla hazırlayıcıdır. Bir hız limiti, eşzamanlı değişiklikleri güvenli bir şekilde ele almalıdır.
Ağır Koruma Koruma için Mutexes kullanımı
En basit iplik güvenlik yaklaşımı tüm okurları sarmak ve bir mutex içinde oran limiter duruma yazmak. Bu, oran limitli olarak veya kritik bölümden kısa olduğu zaman iyi çalışır.
#include <pthread.h>
typedef struct {
pthread_mutex_t lock;
unsigned long long request_count;
time_t window_start;
} RateLimiterMutex;
void init_mutex(RateLimiterMutex *rl) {
pthread_mutex_init(&rl->lock, NULL);
rl->request_count = 0;
rl->window_start = time(NULL);
}
int allow_request_mutex(RateLimiterMutex *rl, unsigned long long limit, unsigned long long window_sec) {
pthread_mutex_lock(&rl->lock);
time_t now = time(NULL);
if (now - rl->window_start >= window_sec) {
rl->window_start = now;
rl->request_count = 0;
}
int allowed = 0;
if (rl->request_count < limit) {
rl->request_count++;
allowed = 1;
}
pthread_mutex_unlock(&rl->lock);
return allowed;
}
Mutex özel erişim sağlar, ancak içerikleme yüksek aktarım altında bir şişenck olabilir. Birçok pratik sistem için kabul edilebilir çünkü oran-limiting check gerçek istek işleme kıyasla çok hızlı.
Lock Free Approaches with C11 Atoms
Maksimum performans için, daha önceki örnekte olduğu gibi atomik işlemleri kullanın. Ancak, pencereyi sıfırlayıcı olarak işlemek, çünkü atomik olarak pencereyi okumak ve onu karşıla birlikte güncellemek gerekir.Bir çözüm her iki pencerenin de zaman ve sayılarını bir 64-bit değerinde depolamak, yüksek çözünürlükte zamanları ve düşük çözünürlükte bir şekilde sıfırlamak için izin verir.
Network I/O ile Sınırlama
Bir oran limiter, gerçek ağ trafiğine bağlı olarak sadece yararlıdır. C ağ sunucusunda, talep kabul noktasında veya talep dilekçeyi işlemeden önce fiyat limiti çağırabilirsiniz.
Yüksek seviyeli Servers için epoll kullanmak
Bir etkinlik odaklı sunucuyu kullanarak 444D4'ü kullanıyor, genellikle IP adresi veya API anahtarı tarafından anahtarlanmış tek bir ipe sahip olursunuz (veya küçük bir iplik havuzu) müşteri oranı limiti I/O. HızT:5'ı arayarak veya yazmadan önce ayarlanabilir. Örneğin, basit bir statik görüntü kullanarak.
typedef struct {
char ip[16];
RateLimiter rl;
} ClientEntry;
// Hash, lookup, etc. – omitted for brevity
// On connection:
ClientEntry *entry = lookup_or_create(ip);
if (allow_request(&entry->rl, LIMIT, WINDOW)) {
// process request
} else {
// send 429 and close
}
[FONT=0)Beej'in Ağ Programlama Kılavuzu), C'de mükemmel soket programlama örnekleri ile bir araya gelebilir.
Pratik Örnek: Rate-Limited HTTP Server Snippet
En az HTTP sunucusunun inşa edildiği göz önünde bulundurun: $ 3.38.Eğer inkar ederse, bu yaklaşım, HTTP isteğinin ilk satırını okur ve müşteri IP'yi (örneğin API’li müşterileri) alabilir.
Gelişmiş Düşünmeler ve Optimizasyonlar
Birçok Müşteri için bellek Verimliliği
Hız limitli olduğunda, IP adresi başına per-client (örneğin, IP adresi başına), çok sayıda işlem sunucuları için paylaşılan hafızada bulunan LRU evlendirme politikası kullanın. yakın zamanda bağlı olmayan müşteriler için giriş yapmak için LRU evlendirme politikası kullanın.Services like ESFLT:11 simpleks.
Configurable Rate Limits and Hot Reload
Sert kodlanmış sınırlar esnektir. Bir yapılandırma dosyası veya çevre değişkenlerinden sınırları okumak için oranı limitleyici tasarlayın. Sıcak reload (kullanıcıyı yeniden başlatmadan limitler), küresel bir atom değişken veya bir noktalayıcıyı atomik olarak değiştirilebilecek bir yapılandırma yapısına kullanın.
Logging ve İzleme ile entegrasyon
Her bir müşteri kimliği ve zaman notu ile birlikte reddedilen istek. Bu veriler, limitleri ayarlamaya ve kötüye kullanmayı algılamaya yardımcı olur. Prometheus gibi ölçüm sistemleri ile Prometheus gibi ölçüm değerleri veya yapılandırılmış loglar için yazılabilir. C serverslar syslog veya özel bir günlük tampon kullanabilir.
Ortak Pitfalls ve En İyi Uygulamaları
Zamandan Kaçınma
Her zaman monoton bir saat ([[DÜT:12) kullanmak ([[DÜŞÜN) veya [[DÜŞÜNCÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞ
Move Clock resets
monoton saatler bile sonlu bir karara sahip olabilir.ŞUygunda 16.Ş. ..........................................................................................................................................................................................................................................
Test Oranı Limiters
Bir sonraki istek reddedilir ve pencere sona erdiğinde, birden fazla threadle stres testleri, penceredeki başarılarını kontrol etmelidir.Bir test avantajını tam olarak aynı anda sınırlı tutar.
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
C'de bir oran limiterini uygulamak, ağ-yüz uygulamaları üzerinde çalışan herhangi bir geliştirici için pratik bir beceridir. Algoritma seçimi - pencereyi ekleyen pencere, kaydırıcı pencere, token kova veya sızdıran kova - burada bulunan örnekler, per-cli devlet, yapılandırma yönetimi ve üretim-düşünceli hata işlemleri ile genişletilebilir.