2009-03-05 15 views
30

Bir REST API'sini bir araya getiriyorum ve nasıl ölçekleneceğinden emin olamadığım ya da bunun için ne talep edileceğinden emin değilim, bunun geçici kullanımını reddedebilmenin yanı sıra limit kullanımını da değerlendirmek istiyorum. Kutu kapasitesi bittiğinde ya da bir tür kesişen senaryo varsa.REST API'sı kullanıcıları sınırlamak için en iyi yöntem nedir?

Ayrıca, daha fazla kapasite ekleyerek hizmeti ölçeklendirmem gerekirse, hizmeti geçici olarak (ana hizmetin bir bit için çevrimdışı olduğunu belirten istemciler verirken) geçici olarak yavaşça getirebilmeyi isterim.

Bu tür şeyler için en iyi uygulamalar var mı? Uygulama mysql ile Rails.

cevap

17

'un bir parçası olarak uygulamaktır. Bu, tüm dünyayı dinleyen dış web sunucusu ile yapılır (nginx veya lighttpd'yi öneririm).

Hız sınırlarıyla ilgili olarak, nginx sınırlandırabilir, yani her IP için 50 req/dakika, her biri özelleştirebileceğiniz 503 sayfası alır.

Beklenen geçici olarak, raylar dünyasında bu, özel maintainance.html sayfası aracılığıyla yapılır. Raylar uygulama sunucuları aşağı indiğinde dosya oluşturan veya bağlayan bir çeşit otomasyon var. Dosya varlığına değil, uygulama sunucusunun gerçek kullanılabilirliğine güvenmenizi öneriyorum.

Ancak gerçekten hiçbir bağlantıyı kaybetmeden hizmetleri başlatıp durdurabiliyorsunuz. Yani Farklı UNIX soket/IP bağlantı noktası üzerinde uygulama sunucusunun ayrı bir örneğini çalıştırabilir ve bu yeni örneği de dengeleyici (nginx/lighty/haproxy) kullanabilirsiniz. Sonra eski örneği kapatırsınız ve tüm istemcilere sadece yeni biriyle sunulur. Bağlantı yok. Tabii ki bu senaryo her zaman mümkün değildir, yeni versiyonda uyguladığınız değişimin türüne bağlıdır.

haproxy yalnızca dengeleyici bir çözümdür. Çiftliğinizdeki uygulama sunucularına istekleri son derece verimli bir şekilde dengeleyebilir.

  • api.domain yuvarlak robin N dengeleyici dinamik için statik ve P uygulaması sunucuları için M webserverlarda için
  • her dengeleyici vekiller istekleri çözme: oldukça büyük hizmet için

    gibi bir şey ile-up bitirmek içeriği. Oh iyi REST API'niz statik dosyalara sahip değil mi?

Oldukça küçük bir hizmet için (2K rps altında) tüm dengelemeler bir iki web sunucusunda gerçekleştirilir.

2

Aksi takdirde yüksek trafik uygulamanızı öldürme etkisine sahip olacağından, oran sınırlarını uygulamanızın dışında kullanmanızı öneririz. İyi bir çözüm, apache vekilinizin bir parçası olarak, mod_evasive

+1

Apache yüksek yüklü araziden yok mu? frankodwyer kesinlikle eşzamansız bağlantıların birçoğu için async ağına ihtiyaç duyuyor ve mpm_event henüz üretimde kararlı değil. Tabi ki apache ayrı kutulara konabilirdi ... sadece apache ile uğraşmak için onları almak için bir nokta var mı? – temoto

+1

Muhtemelen isteklerin büyüklüğüne ve her bir talebin uygulamaya olan maliyetine bağlıdır.Benim deneyimlerime göre, apache, eş-konumlu bir proxy para cezası yaratan arka uç uygulamasından daha fazla istek büyüklüğüne sahip siparişleri kolayca işleyebilir. –

5

Zaten iyi yanıtlar - sınırlayıcıyı kendiniz uygulamak istemiyorsanız, API'ler için hız sınırlama, analitik vb. Yapan 3scale (http://www.3scale.net) gibi çözümler de vardır. 3scale mimarisine giren bir eklenti (ruby api plugin için buraya bakın) kullanarak çalışır. Ayrıca vernik ile kullanabilir ve vernik işlemini oran sınırlayıcı vekil olarak kullanabilirsiniz.

İlgili konular