MMO'larda yük dengeleme nasıl sağlanır?


26

Tek bir parça veya bölge için işlem yapmanın yükü hafifletmek için birkaç sunucu üzerinden yapılabileceğinin yaygın bir gereksinimi olduğuna inanıyorum. Tüm oyuncuların ve tüm NPC'lerin etkileşime girebileceği birleşik tutarlı bir dünyayı korurken bunun nasıl yapılabileceğini merak ediyorum.

Sorum şu: MMO'larda yük dengelemesi nasıl sağlanıyor?

Bu konudaki bilgilerimin nasıl geliştirileceğine dair bağlantılar, kitaplar veya genel bilgiler de takdir edilmektedir.

Yanıtlar:


30

Bunu olabildiğince basit tutmaya çalışın ve arayüzler iyi tanımlanmış ve belgelenmiştir. Üretimdeki karmaşık bir sistemi korumak ve hata ayıklamak kolayca cehenneme dönüşür. Eğer basit ve karmaşık bir yaklaşım varsa, karmaşık olana gitmeden önce iki kez düşünün.

Hizmetleri Tanımlama

İlk adımın hizmetleri ve bağımlılıklarını belirlemek olduğunu düşünüyorum : Statik İçerik, Kimlik Doğrulama, Yerel Sohbet, Küresel Sohbet Kanalları, Bölgesel Sohbet Kanalları, Arkadaş Listesi, Guilds, Çanta / Envanter, Müzayede Evi, Küresel Harita, Dünya, ...

Sonra bu hizmetlerin her biri için müşterinin doğrudan onlarla konuşup konuşmayacağına karar verdi . Örneğin, müşterinin Global Sohbet Kanallarından sorumlu sunucularla doğrudan konuşmasına izin vermek oldukça kolaydır. Dünya sunucularının sohbet mesajlarına karışması gerekmez. Bölgesel Sohbet aynı şekilde uygulanabilir, ancak oyuncular bölgeleri değiştirdiğinde dünya sunucularının sohbet sunucularına anlatması gerekir. Yine, mesajları umursamayacaklar.

Üçüncü adım, bir hizmet içindeki yük dengelemeyi düşünmektir . Örneğin, küresel ve bölgesel sohbet kanalları, adlarına göre birden fazla sunucuya bölünebilir. Muhtemelen bu bölünmeyi müşteriye zorlamak değil, bir arama hizmeti sunmak iyi bir fikirdir.

Dünya Sunucuları

En zor kısım genellikle dünya sunucuları , bu yüzden basit bir yaklaşımla başlıyorum. Muhtemelen müşterinin içinde bulunduğu bölgeden sorumlu sunucu ile doğrudan konuşmasına izin vermek iyi bir fikirdir. Bu yüzden giriş yaparken veya müşteriyi geçerken müşteriye hangi sunucuya bağlanacağı söylenmelidir.

Basit yaklaşım dünyayı bağımsız bölgelere bölmektir . Bağımsız bölgelerle, bir oyuncunun bir kısımdan diğerine bakamayacağı ve canavarların parçaları geçemediği anlamına gelir. Bu bölgeler dış dünyadaki manzaraya ve öyküye dayanarak gördükleri bölgeden farklıdır. Genellikle canavarların çoğu zindandadır ve oyuncular bir zindana girmek için bir kapıdan geçmeleri gerektiğini kabul etme eğilimindedirler. Özellikle, bu zindanlar oyuncu başına grup bazında örneklendiyse. Dış dünyadaki diğer örnekler, yüksek dağlarla çevrili farklı kıtalar ve vadilerdir.

Bir sürekli dünyanın o iyi planlamamız mantıklı yaklaşım, gerçekten hızlı karmaşık alır: Bilgi istemci ihtiyacını ne yapar? Sunucular hangi bilgileri paylaşmalıdır? Oyuncu çoğunlukla aynı bölgedeki nesnelerle (canavarlar ve NPC'ler dahil) etkileşime girecektir. Bölge sınırındaki nesneleri tıklama aralığının dışına yerleştirerek hile yapabilirsiniz. Bu, müşterinin çoğunlukla komşu bölgeler için salt okunur bilgiyle ilgilendiği anlamına gelir. Bu gibi durumlarda, bölge sunucuları, oynatıcının komşu bir bölgeye bağlanmak için yeterince yakın olup olmadığına dair izin kontrolü dışında hiçbir şeyi koordine etmek zorunda değildir.

Bu, yalnızca nesnelerin veya eylemlerin bir sunucu sınırını geçmesi gereken çok az sayıda zor durum bırakır . Bu iyi bir şey çünkü oklar ve büyü gibi durumlar performans açısından kritik öneme sahip. Mücadeleyi saldırıya ve savunmaya bölmek iyi bir fikir olabilir. Böylece bir büyü tekeri sunucusu, tekerin konumu da dahil olmak üzere saldırı parametrelerini tanımlayacaktır. Savunucunun sunucusu, saldırı hakkında mesaj alacak ve etkiyi hesaplayacaktır. Saldırganın sunucusunun etkiyi bilmesi gerekmez; müşteri salt okunur bağlantısını kullanarak bunu öğrenecektir.

Oynatıcı modelinizin ne kadar karmaşık olduğuna bağlı olarak, başka bir sunucuya aktarılması birkaç saniye sürebilir (Second Life'ın bununla ilgili büyük bir sorunu var). Oyuncu sanal bir sınıra yaklaştığında , transfer önceden hazırlanarak sorun çözülebilir . Böylece, gerçek aktarma gerçekleştiğinde, oynatıcı verilerinin çoğu hedef sunucuda zaten önbelleğe alınır.

özet

Küçük bağımlılıklara sahip sunucular arasında bölünebilecek farklı hizmetler tanımlayarak sorunu bölün. Bir sonraki adımda, kritik hizmetler içinde yük dengesinin nasıl yapıldığına bakın. Temsilci dengeleme, doğrudan ilgili sunuculara bağlanmasını söyleyerek istemciye çalışır (açıkçası sunucular izinleri kontrol etmek zorundadır). Mümkün olduğunca basit tutun, çeşitli hizmetlerin ve sunucuların sorumluluklarını iyi belgeleyin, hata ayıklama çıktısını etkinleştirme seçeneğini belirtin.

Not: Bu tekniklerden bazıları güvenilirliği artırmak için kullanılabilir. Ve bunu aklınızda tutmalısınız, çünkü birçok sunucuyu kullanmak, kırılma riski çok daha yüksek anlamına gelir; Sadece yazılımda değil, donanım seviyesinde de.


Fakat gerçekten, bu süreçler arası iletişimi nasıl yapıyorsunuz? ne tür bir IPC kullanılmalı?
majidarif

10

Genel olarak dünya, daha küçük bölgelere ayrılmıştır. Bu bölgelerin her biri genellikle bağımsız bir sunucu işlemidir (WoW'un dünya sunucuları veya Eve's Sol düğümleri) ve bir dizi makinede çalışabilir. Bazı oyunlarda haritalar arasında açık kapılar vardır (Eve, STO, Guild Wars), bazıları ise bunu daha fazla maskelemeye çalışır (WAR, Free Realms). Daha kusursuz yaklaşımı tercih edenler, genellikle iki sunucu arasındaki sınıra yaklaştığınızı algılar ve iki süreç bir geçiş anlaşması yapar. Bunun bir tanımını bulmak için muhtemelen en iyi yer, hücre kulelerinin hareketli el cihazlarının geçişlerini yapmasıdır. Tek bir haritanın yükü (Jita, Ironforge, Earth Space Dock) gerçekten büyük olursa, bazen tek tek işlevleri diğer sunuculara devredebilirsiniz (AI, oyuncu yönetiminin bazı bölümleri) ancak bunun baştan beri yerleşik olması gerekir veya ciddi bir güçlendirme gerektirir. Neredeyse her zaman bu birkaç haritaya adamak için daha iyi donanım satın almak daha uygun maliyetlidir.


9

Tek bir parça veya bölge için işlem yapmanın yükü hafifletmek için birkaç sunucu üzerinden yapılabileceğinin yaygın bir gereksinimi olduğuna inanıyorum. Tüm oyuncuların ve tüm NPC'lerin etkileşime girebileceği birleşik tutarlı bir dünyayı korurken bunun nasıl yapılabileceğini merak ediyorum.

Muhtemelen düşündüğün kadar yaygın değildir; en azından, sorunsuz bir dünyanın aynı anda birkaç sunucu tarafından yönetildiğini düşünüyorsanız.

Tamamen ayrı parçaları saymazsak, "yatay" ve "dikey" olarak düşünülebilecek bir çevrimiçi oyunu bölebileceğiniz 2 yol vardır:

  • Oyunu birçok coğrafi alana bölün. Herhangi bir coğrafi alanın tüm işlevleri tek bir sunucu tarafından yönetilir ve bunlar arasında gerçek bir etkileşim yoktur. (Sunucu başına sadece 1 bölge olması gerekmediğine dikkat edin - bir sunucu aynı anda birkaç bölgeyi tutabilir ve değişen yükü işlemek için bölgeler belki de sunucular arasında aktarılabilir.)
  • Oyunu çeşitli servis türlerine ayırın - örneğin. giriş / yetkilendirme, oyun kuralları ve fizik, sohbet + açık artırmalar, sebat, vb. Bu servislerin her biri farklı bir sunucu tarafından kullanılabilir. nhnb'nin cevabı, bir geliştiricinin oyunlarını bölümlere ayırabileceği diğer potansiyel hizmetleri de sıraladı.

Açıkçası bu yaklaşımlar ortogonaldir ve ikisini birleştirebilirsiniz. Aslında, oyun dünyanızdan ayrı bir makineye giriş yapmak / giriş yapmak için çok yaygın olan ve sohbeti ve diğer kritik olmayan iletişimleri ortadan kaldırmak için yaygın olarak yaygın olan ayrı bir veritabanı sunucusuna sahip olmak neredeyse zorunludur. ayrılmıştır.

Fakat genel olarak, coğrafi bölümleme olduğunda, oyunların çoğu bu sınırlar arasında etkileşime girmenize izin vermez, çünkü iyi yapmak zordur. Bunun yerine, görünmesini sağlamak için başka yollara başvuruyorlar , hepiniz hala aynı grupta ve aynı sunucudasınız gibi . Örneğin. - Bölgeler arasında veya bir kıtadan diğerine geçiş yaparken bir sunucu değişikliğini kapsayan ekranları veya diğer animasyonları yükleme. - herkesten izole edilmiş ayrı zindan veya baskın örnekleri. Bunlar bir kırık içindeki bir parça gibidir ve yük dengelemesine yardımcı olarak ayrı bir sunucuda kolayca çalıştırılabilir.

WoW'daki otorite ile konuşamıyorum ama sanırım bunların neredeyse hepsini yapıyorlardı: bir tür portallar tarafından birleştirilen etkileşime giremeyen ayrı coğrafi bölgeleri denemek, ayrı bir uç ve kimlik doğrulama sunucuları. WoW alemlerinin belirli bir alanda çevrimiçi olarak 1000 ila 10000 oyuncu arasında bir şey olduğunu duydum, bu da yukarıdaki şemalarla kolayca yönetilebilir.

Ancak, tek bir büyük dünyaya sahip olduğunuzu ve oyuncuların bir sunucunun bitişik bir sunucudaki oyuncularla etkileşime girmesine izin vermeniz gerektiğini varsayalım. Teoride bunu yapmak kolaydır - ilk olarak, sunucular sınırlar boyunca nesnelerin ayrıntılarını paylaşmak için işbirliği yapmalıdır (bu nedenle bir sunucudaki bir nesnenin bir başkasında proxy gösterimi olabilir) ve ardından tüm mantığınızı mesaj geçişi olarak değiştirin mesajlar gerektiğinde yetkili sunucudan yetkili kaynağa yönlendirilir. Mesajlar sunucular arasında veya bir sunucu içerisinde oldukça şeffaf şekilde geçirilebilir, böylece bir yaklaşım tüm sistemlere uyar.

Buradaki sorun, daha önce basit bir mantığın mesajlara çevrildiğinde çok karmaşık hale gelebilmesidir - örneğin. Her iki oyuncu da bir sunucudayken güvenli ve atomik olarak gerçekleşebilecek 2 oyuncu ticareti, mesajların ileri ve geri gönderilmesi, her gönderimde yeniden doğrulanması ve bir oyuncunun yararlanamamasını sağlamak için gerekli önlemlerin alınması durumunda daha uzun bir süreç olur. Bir mesaj seyahat ederken ticareti değiştirerek diğeri. Diğer oyuncuya, mesaj geldiğinde (ölebilecekleri, çıkacakları, vb.) Hala var olacağını varsayamazsınız, böylece kod çok karmaşık hale gelir. Ve bu, 2 veya daha fazla işletmenin etkileşime girebileceği veya işbirliği yapabileceği hemen hemen her sistem için geçerli olacaktır - ticaret, savaş, gruplama, açık artırma, yağma paylaşımı, eğitim, vb.

Bu problemler aşılmaz değildir ancak çoğu oyun için, yükü diğer yollarla paylaşabildiğinizde ve tüm oyun mantığınızı bir sunucuda tutarken denemeye değer olmaları çok zordur. Bu yüzden neredeyse bütün güncel oyunlar o rotadan aşağıya iner.


3

Bir MMO sunucusunu dengelemek için pek çok yük yöntemi vardır, çünkü işlenecek oldukça geniş bir veri aralığı vardır. İşlem bin ağaç yöntemini tercih ederim.

Genel sunucu, kullanıcı bağlantılarını birden fazla kullanıcıyı aynı anda işleyebilecek bir işlem kutusuna iletir. işlem kutuları tüm karmaşık işlemleri gerçekleştirir ve yalnızca global sohbet ve konumlandırma gibi global olarak alakalı verilerle global sunucuya cevap verir. Bu yöntem bölge sunucularından çok daha iyi dengeler, çünkü bölgeler nüfus içinde büyük ölçüde değişebilirken, genel kullanıcı işlemesi çoğunlukla kendisini doğal olarak dengelemesi için yeterlidir.

Sadece bazı temel yükleri global sunucu üzerinden dengeleme yapın, böylece bir işlem kutusu belirli bir hafıza / cpu kullanımına ulaştığında, yeni bir işlem kutusu sunucusu başlatırsınız.


İşlem kutuları arasında paylaşılan verileri (örneğin, farklı işlem kutularındaki iki kullanıcı arasındaki mücadele) nasıl paylaşıyorsunuz? Etkinlik sıralamasını nasıl sağlıyorsunuz? Böylece, öldürülen bir oyuncu artık bir saldırı yapamaz, onu öldüren çöp bu saldırıyı yapandan daha yavaş olsa bile. Gönderim ek yükünün genel sunucuda yükselme riski var mı? Kullanıcı bağlantıları için proxy modeli, ağ yığını üzerinde işletim sistemi sınırlarına girebilir.
Hendrik Brummermann 30:10

Bu model çoğu işlemin izole edildiği bilgi sistemlerinde oldukça iyi çalışıyor. Yani genellikle aynı veriler üzerinde çalışmazlar ve nadir durumlarda kilitleme veya geri alma kullanılır. Ancak kavgaların birden fazla oyuncu ve / veya yaratık içerdiği oyunlarda ve saldırıların etkisi hem saldırganın hem de savunucunun özelliklerinden etkilenir, bu yaklaşım zor olabilir.
Hendrik Brummermann 30:10

Kolay yoldan gidebilir ve çok kullanıcılı etkileşimleri genel olarak alakalı olarak düşünebilir veya işlem kutularının birbirinden haberdar olması ve iletişim kurması için basit bir yöntem oluşturabilirsiniz. Her işlem kutusu bir kerede yaklaşık on bin kullanıcıyı idare edebilmelidir, bu nedenle kullanıcılar arasındaki durum iletişimi çok fazla sorun olmamalıdır. Bölge yöntemi biraz daha kolay, ancak dengesiz değil ve aynı bölgeye çok fazla kullanıcı girerse kolayca çökertilebilir. Büyük bir kullanıcı tabanı olan bir MMORPG'de yükü eşit olarak dengelemek çok önemlidir.
Stephen Belanger

Savaş gibi bir sistemi pazarlık edebilmek için 2 işlem kutusu için "basit bir yöntem" bilmek isterdim. Sorun düşük seviye haberleşmeler değil, tipik oyun algoritmaları dağıtılmış katılımcılarla çok karmaşıklaşıyor.
Kylotan

Uygulamamda, global sunucum bağlı tüm müşterilerin bir listesini tutuyor ve hangi işlem kutusuna bağlı olduklarını takip ediyor. Bir işlem kutusunun başka bir kullanıcıya erişmesi gerekiyorsa, önce kendi kullanıcı listesini kontrol eder. Bu başarısız olursa, genel listeyi kontrol eder ve diğer kullanıcının hangi işlem kutusuna bağlandığını tanımlar. İşlem kutuları daha sonra birleşik işlemi gerçekleştirirken kullanıcı durumlarını doğrudan paylaşmak için bağlanır.
Stephen Belanger
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.