2011-02-11 12 views
10

PHP'de birkaç yıl büyük ölçekli oyun sunucusu geliştirdim. Bir yük dengeleyici, bir kümedeki bir sunucuya gelen istekleri temsil eder. Daha iyi performans adına, biz apc_store ve apc_fetch yoluyla doğrudan Apache paylaşılan hafızada, bu kümedeki her örnekleri üzerinde tüm statik verileri (aslında oyun dünyanın modeli nesneler) önbelleğe başladı.apc_store/apc_fetch gibi PHP, Apache paylaşımlı bellek mağazalara iyi Flask/Python/WSGI analog nedir?

Bazı nedenlerden dolayı, Flask mikro çerçevesini kullanarak Python'da benzer bir oyun çerçevesi geliştirmeye başlıyoruz. İlk bakışta, bu vakanın hafıza deposu doğrudan Python/Flask'a çevirmek için görünmeyen tek parçadır. Şu anda Memcached'i her bir örnekte yerel olarak çalıştırmayı düşünmekteyiz (ana Memcached kümesinden oldukça büyük model nesnelerin akışını önlemek için.)

Bunun yerine ne kullanabiliriz?

cevap

2

[Beş ay sonra]

Oyun çerçevemiz tamamlandı. Her bir web sunucusunda, statik verileri tam olarak başlatılmış sqlalchemy model örneklerinde saklamaya karar verdik. Yeni açılan bir oyun sunucusu ısındığında, bu örnekler ilk önce paylaşılan bir MySQL db'ye basılarak oluşturulur. Bizim örnek fabrikalar bir örnek havuzuna erteleme yana

Model örnekleri yalnızca sunucu başına dağıtım başına bir kez inşa edilmesi gerekir - bizim ölçeğinde, MySQL devam eden yükün her türlü altında ağlardım çünkü bu önemlidir. Uygulamanın kendisini kodu: Olabildiğince bizim uygulama koduna kadar yakın öğe tanımları tutarak tel üzerinden bu verileri akış değil hedefimizi başarılı.

Şimdi asıl sorumun naif olduğunun farkındayım, çünkü LAMP yığınının aksine Flask sunucusu isteklerin arasında çalışıyor, sunucunun hafızası "paylaşımlı hafıza" - APC gibi bir şey yapmaya gerek yok. . Aslında, istek işleme kapsamı bu benlik ve Flask's threadsafe local store ait şey dışında, "ortak bellek" olarak kabul edilebilir.

5

Bu durumda bile, her sunucuda bir dizi bağımsız olan yerine merkezi anahtar/değer deposu sistemine sahip olmayı düşünebilirsiniz. senin yük dengeleyici her zaman bir kullanıcının istekleri farklı sunuculara her zaman yönlendirilir nerede bir durumda içine çalıştırabilir, aynı sunuculara aynı kullanıcıları yönlendirir sürece bu yüzden her bir düğüm paylaşılan önbellekten erişmek yerine oyun durumunu almak zorunda kalacak. Ayrıca, her sistemde yerel bir anahtar/değer deposunun oluşabileceği bellek zorlaması, oyun sunucunuzun diğer işlevlerini yavaşlatabilir. Bu, büyük oranda önbelleğe alınan veri miktarına bağlı olmasına rağmen.

Genel olarak en iyi yaklaşım, memcached bir küme ve sakladığınız nesnelerin türlerine karşı yerel depolama ile ne tür bir performans elde edeceğinizi görmek için bazı ölçütleri çalıştırmak olacaktır.

Anahtar/değer deposundan istediğiniz diğer özelliklere bağlı olarak mongodb (http://www.mongodb.org /) gibi bazı alternatifleri de inceleyebilirsiniz.

+0

Ben kısa ömürlü anahtar/değer için benim gerçek veri deposu için merkezi MemBase ve merkezi Memcache'ı kullanın. Gönderide belirttiğim gibi, "ana Memcached kümelenmemizde oldukça büyük model objeleri telsizden korumaktan" söz ediyoruz. Bu değişikliği bir önceki oyunda yerel belleğe dönüştürmek bana büyük bir performans artışı sağladı. Bunun gibi bir oyun için ayarlanan tüm statik veriler 50mb'nin altında olduğundan, depolama/yükleme bir sorun değildir.Sonuçta, sonunda nihayetinde yerel belleğe çekmek zorunda kalacaksınız; Her şeyden önce orada saklanırsa daha iyisi :) –

+0

Temel dayanak noktası, merkezileştirilmesi gereken verilerin merkezileştirilmesi ve uygulama sunucularına aktarılabilen verilerin (yani, vatansız ve tüm düğümlerde aynı olan statik/oyun dünyası verileri) olması gerektiğidir.) uygulama sunucularına aktarılmalıdır. –

+0

Üzgünüm Bu cevabı, görevimin iki önemli noktasını göz ardı ettiği için kabul edemem: [1] Sadece statik verilerden bahsediyorum ve [2] zaten Merkezi Memcached kullanıyorum. –

İlgili konular