Kesintisiz MMO sunucu mimarisi hakkında bilgi


9

Kesintisiz MMO sunucularında herhangi bir malzeme arıyorum! "Devasa Çok Oyunculu Oyun Geliştirme" kitaplarında ve "Oyun Programlama Taşları 5" de birkaç makalem var. Bu konuda deneyimli veya bu konuda makaleler bilen var mı?

"Üst düzey görünümler" ve uygulamalarla ilgileniyorum. Bu benim yüksek lisans tezimin konusu olabilir ve tezi başlatmadan önce böyle bir sistem yazmanın ne kadar zor olduğunu öğrenmek istiyorum. Şu anda hangi dili kullanacağım hakkında karar vermedim, Java veya Scala'yı düşünüyorum. Erlang bir seçim olabilir, ama bununla hiç çalışmadım.

Not: Temel gereksinim hareket olabilir. Diğer tüm oyun sistemleri isteğe bağlıdır ve "bonus kredi" sağlar.

Şimdi "sorunsuz sunucu" ile ne demek istediğim için: Ben her düğüm statik dünya sınırları, oyun dünyasının bir bölümünü kontrol bir sunucu kümesi kurmak istiyorum. Oyuncular artık bir örneği değiştirmeden ya da bir "ışınlayıcıya" çarpmadan dünyanın bir ucundan diğer ucuna geçebilirler. Bence WoW bunu yapıyor. Ancak arka uçta, oyuncu bir sunucudan diğerine geçer.


Bir süre önce her WoW sunucusunun her kıta ve veritabanı için 1'den fazla bıçak içerdiğini okudum. Aynı zamanda zindanlar ve savaş alanları olarak da kullanılmıştım, ancak şimdi bunların çapraz bölge bağlantılarına izin vermek için kendi kümelerinde bulunduğunu varsayıyorum. Kısacası, kıtalar bir sunucuda tutulur - kıtaları değiştirmediğiniz sürece başka bir sunucuya geçiş yaptığınız bir nokta yoktur.
Dinlenme

İlginç, bunu nereden okuduğunu hatırlıyor musun? Dediğim gibi, asla WoW oynamıyorum ve kıtaların ne kadar büyük olduğunu bilmiyorum, ama her kıtanın ayrı bir sunucuda barındırıldığını hayal edemiyorum.
Lurca

3
WoW sunucu istatistikleri: toplam 13.250 sunucu sunucusu, 75.000 toplam CPU çekirdeği, 112.5 terabayt RAM (GDC Austin 09'dan itibaren). Buraya bakın ; mutlaka WoW'a adanmış değil, ancak yeterince yakın.

@Josh Petrie: Teşekkürler, bu makaleyi günün erken saatlerinde buldum. Yine de kesintisiz veya sürekli sunucu mimarisi hakkında bir şeyler arıyorum.
Lurca

Yanıtlar:


5

Böyle bir sistemi yönetmedeki ana karmaşıklık, ne kadar kesintisiz olmanız gerektiğinden kaynaklanmaktadır. Josh'un dediği gibi, bir varlığı bir sunucudan diğerine teslim etme sorunun çözümü, paketin önemli bir parçasıdır.

Bu tek sorun değil - birden fazla sunucudaki varlıkların bir işlemin parçası olarak etkileşime girmesi gerekiyorsa, artık ilerlemek için her sistemin diğer taraftan verilere ihtiyaç duyduğu bir senkronizasyon sorununuz var, ancak verilerin geldiği zaman zaten geçersiz. Bir tarafı geri çekilirse, işlemi geri alma özelliğine sahip birden fazla mesaja bölerek çözmeye çalışabilirsiniz, ancak "Devasa Çok Oyunculu Oyun Geliştirme" Bölüm 3.1'de gördüğünüz gibi, bu , yapmanız gereken oyun mantığını önemli ölçüde karmaşıklaştırır. ile yapın. Scala ve Erlang mesajlaşma sistemini doğru bir şekilde bulmanıza yardımcı olurlar - 10 hatlı bir fonksiyon olarak kullanılan şeyin şimdi izlemeniz gereken birçok farklı mesaj ve duruma ayrışmasında size yardımcı olmazlar.

Açıkçası, bu sorun tamamen yeni değildir ve ilişkisel veritabanları, tüm verileri merkezi olarak depolayarak ve birden çok istemcinin gerektiği şekilde sorgulayıp değiştirmesine izin vererek, gerektiğinde işlemleri geri alarak bu tür bir sorunu destekler. Bu size doğruluk gereksinimlerinizin çoğunu verir, ancak maalesef pratik mantıksal uygulamaların yanı sıra oyun mantığı uygulamasını garip hale getirir (mantığınızın çoğu artık veritabanı saklı yordamlarında yazıldığı için). Özellikle RDBMS'lerin çoğunun sağladığı güvenilirlik gereksinimlerini ortadan kaldırmak istiyorsanız, farklı türde bir veritabanı burada iyi bir çözüm sağlayabilir.

Çoğu profesyonel oyun, bu problemi denemeyerek, tüm oyuncuları tek bir sunucuya koyacak kadar küçük tutarak, dünyayı gerçekten etkileşimde olmayan parçalara bölerek bu sorunu çözer (yukarıdaki yorumlarda WoW örneğine bakın) veya oyunu coğrafyadan ziyade işleve göre sunuculara dağıtarak (örn. tüm savaşlar bir sunucuda gerçekleşir, hepsi başka bir sunucuda sohbet eder), böylece uğraşacak 'dikişler' olmaz.


3

"Üst düzey görünümler" ve uygulamalarla ilgileniyorum.

Uygulamalar genellikle makul derecede derinden etkilenir ve muhtemelen burada onlardan çok fazla konuşma görmeyeceksiniz. StackExchange yazılımı, bu tür ilgili tartışmalara çok uygun değildir, birisinin zamanının önemli bir yatırımını içereceğinden bahsetmiyorum bile.

Böyle bir sistem yazmanın ne kadar zor olduğunu öğrenmek istiyorum

Diğer sistemlerden daha fazla veya daha az zor değil: gereksinimlerinize ve sürmek istediğiniz özelliklere bağlı olacaktır. Önemsiz uygulamaları önemsiz olarak yazabilirsiniz, ancak önemsiz olmayan şeyler elbette çok daha zor olacaktır. Daha büyük sorunlardan biri, muhtemelen sisteminizin WoW ve diğer oyunların üzerinde çalıştığı "büyük" seviyeye ölçeklenip ölçeklenmediğini söylemek için yeterli gerçek istemcinizin olmayacağıdır .

MMO'lar büyülü değildir. Teknolojilerinin çoğu, izole edildiklerinde özel bir şey değildir, sadece bazı daha küçük, daha basit teknoloji bitleri, bazı paylaşılan dünya devletlerinin daha büyük ölçekli, bağlı paralel simülasyonlarına izin vermek için çok akıllıca birleştirilir.

Her düğümün oyun dünyasının bir kısmını statik sınırlarla kontrol ettiği bir sunucu kümesi kurmak istiyorum. Oyuncular artık bir örneği değiştirmeden ya da bir "ışınlayıcıya" çarpmadan dünyanın bir ucundan diğer ucuna geçebilirler.

Aslında bahsettiğin şey simülasyon dağıtımı. Bu oldukça basit bir şekilde yapılabilir ve mutlaka MMO'ya özgü bir teknoloji değildir (eşler arası oyunlar, ana bilgisayar geçişini uygulamak için aynı temel mekanizmaları destekleme eğilimindedir). Temel öneri, her sunucunun sunucuların "etrafındaki" topolojisini anlamasını sağlamaktır (özellikle, A dünyası düğümü için bir sunucu simülasyon-bitişik dünya düğümleri için sunucular hakkında bilgi sahibi olmalıdır) ve etrafınızda düşündüğünüz bir tampon tanımlamaktır bitişik bir sunucuya "yakın" olan belirli bir simüle edilmiş varlık.

Bir varlık "kapat" arabelleğine girdiğinde, onu bitişik sunucuya da bildirmeye başlarsınız. Varlık gerçek eşiği geçtikten sonra, bitişik sunucuya varlığın tam durumunu içeren bir mesaj ve bitişik sunucunun varlığı devralması gerektiğini belirten bir mesaj gönderirsiniz. Açıkçası bunun mümkün olduğunca güvenilir olmasını istiyorsunuz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.