2012-01-08 44 views
45

Bir API için istekleri sınırlamanın en iyi yolu nedir? Temel olarak, kullanıcıları bir saatte 360 ​​API isteklerine sınırlamak istiyoruz (her 10 saniyede bir talep). Ne akla gelen her API isteği izleme ve depoluyor: Sonra saatlik-istekleri sayacı geri almaNasıl API-Limit Nasıl Kullanılır API

429 - Too Many Requests 

: ip-adresi istek 360 daha büyüktür

ip-address   hourly-requests 
    1.2.3.4    77 
    2.3.4.5    34 
    3.4.5.6    124 

, basitçe ile bir başlık dönmek Her saat. Bu çok verimsiz bir yönteme benziyor, çünkü her API talebinde bir MySQL sorgusu yapmak zorundayız. Ayrıca, her saatte tüm sayaçları sıfırlamak için bir cron görevine ihtiyacımız olacak.

daha zarif/verimli bir çözüm var mı?

+0

Daha esnek bir yaklaşım için, [Token Bucket Algorithm] 'a bakabilirsiniz (https://en.wikipedia.org/wiki/Token_bucket). Sayaçlar performans için bazı hafıza deposunda tutulmalıdır. – botchniaque

cevap

2

Şu anda da bu konuyu araştırıyorum. Şu anki planım (Bu LAMP yığınının olduğunu unutmayın!) APC'nin önbellekleme işlevlerini kullanarak bunu uygulamaktır. Bir istek alındığında, IP'nin APC'nin önbelleğinde saklanıp saklanmadığını kontrol ederim. Eğer öyleyse, 'X' değerinden büyük olup olmadığını kontrol edin, burada birim zaman başına maksimum talepler 'X' olur. Değilse, o IP için önbellek girdisini oluşturun.

Bu sistem veri tabanı erişimi sınırlayan oranını kontrol etmek gereklidir ve bu bir MongoDB veya Redis sunucusu gibi bir şey güvenmek anlamına gelir. PHP'yi APC ile kullandığınızı varsayar; eğer yapmıyorsanız, memcached bunun yerine çalışabilir.

10

Kesinlikle MySQL ile bunu tavsiye etmem - Sorun o kadar değil okur ya da orada vurguladığınızı algoritmada verimsizliği - ama yazar. Birimler yükseldikçe, çok saniyelik yazışmaya başlarsınız. REDIS'i, daha önce bahsettiğimiz başka bir poster olarak depolama olarak kullanıyoruz - tam olarak ihtiyacınız olan atomik artış/eksiltme fonksiyonlarına sahiptir + çok hızlıdır (bellekte) - sadece son derece yüksek ses düzeylerinde payandalamayı yönetmek zorundasınız (ancak bu ultra yüksek MySQL'in yukarısındaki birçok büyüklük derecesi). REDIS'e aşina değilseniz başka bir seçenek Memcached içinde yapıyor - ancak operasyon seviyesinde pek de iyi değil.

Bir başka seçenek hala etkili bir başka şeyler (analitiği, anahtar yönetimi, geliştirici dokümanlar vs.) + bütün bunlar için yaptığı 3scale gibi bir şey (http://www.3scale.net) kullanmaktır. Bir sürü dil için (https://support.3scale.net/libraries) kod eklentileri var ve bunlar altyapıya bağlanıyor. Ayrıca, Vernik Libod'u (https://github.com/3scale/libvmod-3scale/) kullanabilir ve bunu API'nin önündeki bir Vernik önbelleğine ekleyebilirsiniz.

4

performansın ideal bir miktar için, trafik verilerini izleme için bir in-memory database üzerine günlükleri yönetme ve giriş için fonksiyonları ile bir hafif bir web çerçevesi çalıştırabilir, öyle olsun IP veya kullanıcı veya kullanıcı tarafından çağrılan Hizmet dayalı. Daha önemli seçim, kullanmak istediğiniz veri depolamadır.

En ve en çok kullanılan ücretsiz seçenekler:

redis.io gelişmiş anahtar-değer deposu

ehcache standartlara dayalı önbellek, aktif biçimde geliştirilmesi tutulan ve

Terracotta

tarafından profesyonel bir açık kaynak projesi olarak desteklenen hazelcast open source In-Memory Data Grid Daha hızlı yürütme ve sorunsuz esneklik için ölçeklenebilirlik

VoltDB mantıksal veritabanı

8

nginx'i deneyin. Hız sınırlama, yapılandırma dosyasındaki basit değişiklikler yazılarak kolayca yapılabilir. Ayrıca, nginx hızlıdır.

İlgili konular