2010-06-29 18 views
11

Bugün sharded counters in Google App Engine hakkında okurum. Makale, veri deposundaki varlık başına saniyede yaklaşık 5/güncellemede maksimum beklemeniz gerektiğini söylüyor. Ama sanırım, saniyede ne kadar güncelleme yaptığınızı bilmenin bir yolu yoksa, bu çözümün “ölçeklendirilmemesi” mümkün değil. Örneğin, 10 kırıkları ayırabilirsiniz, ancak saniyede 50 güncellemeyle boğulmaya başlar.Google App Engine’de kaç tane parça kırdı?

Güncelleştirmelerin ne kadar hızlı geldiğini nereden biliyorsunuz ve bu sayıyı yeniden parça sayısıyla nasıl besliyorsunuz?

Tahminimce, sayaç ile birlikte yeni aktivitelerin kaydını tutabiliyorsunuz ve eğer bir spike tespit ederseniz, parça sayısını artırabilirsiniz. Bu genellikle nasıl yapılır? Ve eğer öyleyse, neden örnek kodda yapılmıyor? (Bu son soru cevapsız olabilir.) Trafikte otomatik olarak yapmanın aksine, web sitesi etkinliğini izlemek ve trafik artışlarını güncellemek daha yaygın bir uygulamadır mı?

Güncelleme: Çok az sayıda parçaya ve boğulmaya sahip olmanın pratik sonuçları nelerdir? Web sitesinin yanıt vermemesi anlamına mı geliyor yoksa zaman aşımları nedeniyle karşı güncellemeleri kaybetmek mümkün mü?


Bir kenara bakarsak, this question no'lu uçların, anahtarlama yapılmadan uygulanması hakkında konuşur, ancak yanıtlardan biri, trafik yüksekse memcache'nin bile parolalandırılması gerektiğini gösterir. Öyleyse, shard tahsisi ve ayarının bu sorunu önemli gibi görünüyor.

+0

İkinci başına Memcache'ı yaklaşım Kırma işleminde olmadan ele verebilir kaç güncellemeler görmek ilginç olacaktır. (Şu anda verilen bir memcache anahtarını ne kadar hızlı güncelleyebileceğiniz hakkında herhangi bir rakam bulamıyorum.) –

+0

Sadece bunu öğreniyorum, ama memcache dengesiz olması nedeniyle güvenilir değil istediğin zaman. – brainjam

+0

Evet, memcache değerleri gerçekten de herhangi bir zamanda tahliye edilebilir. Genellikle bu bellek baskısı nedeniyle olur (ancak diğer nedenlerle olabilir - memcache sunucuları aşağı gidiyor gibi). Memcache tabanlı çözümlerin neden az sayılabilecek bir nedeni var. –

cevap

4

Web sitenizin popülaritesini manuel olarak izlemek ve gerektiğinde parça sayısını artırmak açıkça daha basittir. Çoğu sitenin bu yaklaşımı benimsediğini tahmin ediyorum. Programlı bir şekilde yapmak sadece zor olmakla kalmaz, aynı zamanda son zamanlardaki tüm etkinliklerin kaydını tutmak için kabul edilemez miktarda ek yük ekler ve kullandığınız parçaların sayısını dinamik olarak ayarlamak için analiz etmeye çalışır.

Seçtiğiniz parçaların sayısıyla birlikte yüksek kenarda biraz daha az karmaşıklaşmanın daha basit yaklaşımını tercih ederim.

Çok az sayıda parçaya sahip olmanın pratik sonuçları konusunda haklısınız. Bir veri deposu varlığını mümkün olandan daha sık güncellemek, bu da başlangıçta bazı isteklerin uzun sürmesine neden olacaktır (yazılanlar tekrar denenirken). Eğer yeterince yığılmışlarsa, zaman aşımına uğradıkça başarısız olmaya başlayacaklar. Bu kesinlikle cevapsız sayaçlara yol açacaktır. Yukarı tarafta, sayfanız çok yavaş olacak ve kullanıcıların datastore üzerindeki baskıyı hafifletmesi için ayrılmaya başlaması gerekecek :).

+0

Ama ama .. ama zaman aşımı olsaydı, sayaçlarım yanlış olur. Bunun bir yaşam kaybıyla sonuçlanmayacağını itiraf ediyorum, ama bu beni biraz rahatsız ediyor. Sadece yaşamamız gereken şeylerden biri mi? – brainjam

+0

Birkaç sayaç kaçırma ihtimali ile yaşamak o kadar da kötü olmayabilir. Sadece beklenen maksimum trafik miktarınızı artıran bazı güvenlik sınırlarını karşılamak için parça sayısını seçmeye çalışın. Daha önemli cevapsız sayımlar, güvenlik sınırınız ne kadar yüksek olmalıdır. –

3

Sorunuzun son bölümünü ele almak için: Memcache değerlerinizin payandalama gerektirmez. Tek bir memcache sunucusu, on binlerce QPS getirme ve güncellemeyi işleyebildiğinden, mantıklı olmayan uygulamaların memcache anahtarlarını parçalamak gerekmeyecek.

+0

Mükemmel, sayılar için teşekkürler! –

2

İstisnalar oluşmaya başladığında neden parça sayısına eklenmez?

bu GAE Example dayanarak:

try{ 
    Transaction tx = ds.beginTransaction(); 
    // increment shard 
    tx.commit();   
} catch(DatastoreFailureException e){ 
    // Datastore is struggling to handle the current load, increase it/double it 
    addShards(getShardCount()); 

} catch(DatastoreTimeoutException to){ 
    // Datastore is struggling to handle the current load, increase it/double it 
    addShards(getShardCount()); 

} catch (ConcurrentModificationException cm){ 
    // Datastore is struggling to handle the current load, increase it/double it 
    addShards(getShardCount());    

} 
İlgili konular