Bagaimana penyeimbangan muatan dicapai dalam MMO?


26

Saya percaya ini adalah persyaratan umum dari MMO bahwa pemrosesan untuk satu shard atau ranah dapat dilakukan melalui beberapa server untuk meringankan beban. Saya ingin tahu bagaimana hal ini dapat dilakukan sambil mempertahankan dunia yang konsisten di mana semua pemain, dan semua NPC dapat berinteraksi.

Pertanyaan saya adalah bagaimana cara menyeimbangkan beban dicapai dalam MMO?

Tautan, buku, atau informasi umum apa pun tentang cara meningkatkan pengetahuan saya tentang hal ini juga dihargai.

Jawaban:


30

Cobalah untuk menjaga ini sesederhana mungkin dan antarmuka didefinisikan dan didokumentasikan dengan baik. Mempertahankan dan men-debug sistem yang kompleks dalam produksi dengan mudah berubah menjadi neraka. Jadi, jika ada pendekatan yang sederhana dan kompleks, pikirkan dua kali sebelum Anda menggunakan pendekatan yang kompleks.

Mendefinisikan Layanan

Saya pikir langkah pertama adalah mengidentifikasi layanan dan dependensinya : Konten Statis, Otentikasi, Obrolan Lokal, Saluran Obrolan Global, Saluran Obrolan Regional, Daftar Teman, Serikat, Tas / Inventaris, Rumah Lelang, Peta Global, Dunia, ...

Kemudian untuk masing-masing layanan ini diputuskan jika klien dapat berbicara dengan mereka secara langsung. Misalnya, cukup mudah untuk membiarkan klien berbicara langsung dengan server yang bertanggung jawab atas Saluran Obrolan Global. Server dunia tidak harus terlibat dalam pesan obrolan sama sekali. Obrolan Regional dapat diimplementasikan dengan cara yang sama, tetapi server dunia harus memberi tahu server obrolan ketika pemain mengubah wilayah. Sekali lagi, mereka tidak perlu peduli dengan pesannya.

Langkah ketiga adalah memikirkan tentang load balancing dalam suatu layanan . Misalnya saluran obrolan global dan regional dapat dibagi ke beberapa server berdasarkan namanya. Mungkin ide yang bagus untuk tidak mengkode kode pemisahan ini ke klien, tetapi menyediakan layanan pencarian.

Server Dunia

Bagian yang paling sulit biasanya server dunia , jadi saya mulai dengan pendekatan sederhana. Mungkin ide yang baik untuk membiarkan klien berbicara langsung ke server yang bertanggung jawab untuk wilayah di mana dia berada. Jadi pada login atau melintasi wilayah klien harus diberitahu ke server mana yang harus disambungkan.

Pendekatan sederhananya adalah membagi dunia menjadi wilayah-wilayah independen . Dengan wilayah independen yang saya maksudkan bahwa seorang pemain tidak dapat melihat dari satu bagian ke bagian lain dan monster tidak dapat melintasi bagian. Wilayah-wilayah itu berbeda dari wilayah yang dilihat pemain berdasarkan lanskap dan kisah dunia luar. Biasanya sebagian besar monster berada di ruang bawah tanah dan pemain cenderung menerima bahwa mereka harus berjalan melalui gateway untuk memasuki ruang bawah tanah. Terutama jika ruang bawah tanah itu dipakai berdasarkan per kelompok pemain. Contoh lain di dunia luar adalah berbagai benua dan lembah yang dikelilingi oleh pegunungan tinggi.

Sebuah dunia yang terus-menerus pendekatan mendapat kompleks benar-benar cepat, sehingga masuk akal untuk merencanakan dengan baik: Apa informasi apakah kebutuhan klien? Informasi apa yang harus dibagikan server? Pemain sebagian besar hanya akan berinteraksi dengan objek (termasuk monster dan NPC) di wilayah yang sama. Anda dapat menipu dengan menempatkan objek di luar rentang klik dari batas zona. Ini berarti bahwa klien sebagian besar tertarik hanya membaca informasi untuk zona tetangga. Untuk kasus ini server zona tidak harus mengoordinasikan apa pun kecuali untuk izin memeriksa bahwa pemain cukup dekat untuk terhubung ke zona tetangga.

Ini hanya menyisakan sejumlah kecil kasus sulit di mana objek atau tindakan harus melewati batas server. Yang merupakan hal yang baik karena kasus-kasus seperti panah dan mantra sangat kritis terhadap kinerja. Mungkin ide yang bagus untuk membagi pertempuran menjadi menyerang dan bertahan. Jadi server spell-caster akan menentukan parameter serangan termasuk posisi caster. Server pembela akan menerima pesan tentang serangan dan menghitung dampaknya. Server penyerang tidak perlu tahu tentang dampaknya; klien akan mempelajarinya menggunakan koneksi read only-nya.

Tergantung pada seberapa kompleks model pemain Anda, mungkin diperlukan beberapa detik untuk mentransfernya ke server lain (Second Life memiliki masalah besar dengan ini). Masalah ini dapat dikurangi dengan menyiapkan transfer terlebih dahulu saat pemain mendekati perbatasan virtual. Sehingga sebagian besar data pemain sudah di-cache di server tujuan ketika serah terima aktual terjadi.

Ringkasan

Membagi masalah dengan mendefinisikan berbagai layanan yang dapat dipisah antar server dengan sedikit ketergantungan. Sebagai langkah selanjutnya lihat bagaimana melakukan keseimbangan beban dalam layanan kritis. Mendelegasikan pekerjaan penyeimbangan ke klien dengan menginstruksikannya untuk terhubung langsung ke server yang relevan (jelas server harus memeriksa izin). Buat sesederhana mungkin, dokumentasikan tanggung jawab berbagai layanan dan server dengan baik, berikan opsi untuk mengaktifkan hasil debug.

PS: Beberapa teknik ini dapat digunakan untuk meningkatkan keandalan. Dan Anda harus mengingatnya karena menggunakan banyak server menyiratkan risiko jauh lebih tinggi dari kerusakan; tidak hanya di perangkat lunak tetapi juga di tingkat perangkat keras.


Tapi sungguh, bagaimana Anda melakukan komunikasi antarproses ini? IPC apa yang harus digunakan?
majidarif

10

Secara umum dunia terbagi menjadi beberapa wilayah yang lebih kecil. Masing-masing wilayah ini biasanya merupakan proses server independen (server dunia WoW atau node Eve's Sol) dan dapat berjalan di salah satu dari sejumlah mesin. Dalam beberapa permainan ada pintu eksplisit antara peta (Eve, STO, Guild Wars) sementara yang lain mencoba untuk menutupi ini lebih banyak (PERANG, Realms Gratis). Mereka yang memilih untuk pendekatan yang lebih mulus umumnya akan mendeteksi ketika Anda mendekati perbatasan antara dua server dan dua proses menegosiasikan handoff. Tempat terbaik untuk mencari deskripsi ini adalah bagaimana menara sel melakukan handoffs dari handset yang bergerak. Jika memuat satu peta (Jita, Ironforge, Earth Space Dock) menjadi sangat besar, Anda kadang-kadang dapat membongkar fungsi individual ke server lain (AI, bagian tertentu dari manajemen pemain) tetapi ini harus built-in dari awal atau akan memerlukan perkuatan yang serius. Hampir selalu lebih hemat biaya hanya dengan membeli perangkat keras yang lebih baik untuk didedikasikan ke beberapa peta itu.


9

Saya percaya ini adalah persyaratan umum dari MMO bahwa pemrosesan untuk satu shard atau ranah dapat dilakukan melalui beberapa server untuk meringankan beban. Saya ingin tahu bagaimana hal ini dapat dilakukan sambil mempertahankan dunia yang konsisten di mana semua pemain, dan semua NPC dapat berinteraksi.

Ini mungkin tidak biasa seperti yang Anda pikirkan; setidaknya, tidak jika Anda berpikir bahwa satu dunia yang mulus dikelola oleh beberapa server secara bersamaan.

Tidak menghitung pecahan yang benar-benar terpisah, ada 2 arah di mana Anda dapat membagi gim daring, yang dapat dianggap "horisontal" dan "vertikal":

  • Bagilah permainan menjadi banyak wilayah geografis yang terpisah. Semua fungsi untuk area geografis tertentu ditangani oleh satu server dan tidak ada interaksi nyata di antara mereka. (Perhatikan bahwa tidak perlu hanya 1 zona per server - server mungkin menangani beberapa zona secara bersamaan, dan zona mungkin dapat ditransfer antar server untuk menangani perubahan beban.)
  • Bagilah permainan menjadi beberapa jenis layanan - mis. login / otorisasi, aturan permainan dan fisika, obrolan + lelang, kegigihan, dll. Masing-masing layanan ini dapat ditangani oleh server yang berbeda. Jawaban nhnb telah menyebutkan layanan potensial lainnya yang dapat dipecah oleh pengembang.

Jelas pendekatan-pendekatan ini bersifat ortogonal dan Anda dapat menggabungkan keduanya. Sebenarnya hampir wajib untuk memiliki server database yang terpisah, sangat umum untuk mendorong masuk / auth ke mesin yang terpisah dari gameplay, dan semakin umum untuk mengurangi chat dan komunikasi non-kritis lainnya juga, tidak peduli bagaimana dunia permainan Anda dibagi.

Tetapi secara keseluruhan, ketika ada pembagian geografis, sebagian besar permainan menghindari membiarkan Anda berinteraksi melintasi batas-batas itu, karena sulit dilakukan dengan baik. Sebaliknya, mereka menggunakan cara lain untuk membuatnya tampak seperti Anda semua masih di beling yang sama dan di server yang sama, padahal sebenarnya tidak. misalnya. - memuat layar atau animasi lain yang menutupi perubahan server saat transisi antar zona, atau dari satu benua ke benua lain. - Contoh dungeon atau raid yang terpisah yang terisolasi dari orang lain. Ini seperti beling di dalam beling dan dapat dengan mudah dijalankan pada server terpisah, membantu penyeimbangan beban.

Saya tidak dapat berbicara dengan otoritas di WoW tapi saya kira mereka melakukan hampir semua hal di atas: memetakan, wilayah geografis terpisah yang tidak dapat berinteraksi bergabung dengan portal semacam, memisahkan back end dan server auth. Saya pernah mendengar bahwa ranah WoW memiliki sesuatu antara 1000 dan 10.000 pemain daring dalam bidang yang diberikan sekaligus, yang mudah dikelola dengan skema di atas.

Tapi, anggaplah Anda memiliki satu dunia besar dan Anda perlu mengizinkan pemain satu server untuk berinteraksi dengan pemain di server yang berdekatan. Ini mudah dilakukan secara teori - pertama, server harus bekerja sama untuk berbagi rincian objek di sepanjang perbatasan (sehingga objek di satu server mungkin memiliki perwakilan proxy di server lain), dan kemudian cukup mengubah semua logika Anda menjadi message-passing, dengan pesan dirutekan dari proxy kembali ke sumber otoritatif jika perlu. Pesan dapat dikirimkan antara server atau dalam server dengan cukup transparan sehingga satu pendekatan cocok untuk semua sistem.

Masalahnya di sini adalah bahwa logika sederhana sebelumnya bisa menjadi sangat kompleks ketika diterjemahkan ke pesan - misalnya. perdagangan 2 pemain yang dapat terjadi secara aman dan atom ketika kedua pemain berada di satu server menjadi proses yang lebih lama ketika pesan harus dikirim bolak-balik, diverifikasi ulang pada setiap pengiriman, dan perlindungan diterapkan untuk memastikan bahwa satu pemain tidak dapat mengeksploitasi yang lain dengan mengubah perdagangan saat pesan bepergian. Anda bahkan tidak dapat mengasumsikan pemain lain akan tetap ada pada saat pesan itu tiba (karena mereka mungkin mati, logout, dll), sehingga kodenya menjadi sangat kompleks. Dan ini akan berlaku untuk hampir semua sistem di mana 2 entitas atau lebih dapat berinteraksi atau bekerja sama - perdagangan, pertempuran, pengelompokan, lelang, pembagian rampasan, pelatihan, dll.

Masalah-masalah ini tidak dapat diatasi, tetapi untuk sebagian besar game, mereka terlalu sulit untuk dicoba ketika Anda dapat berbagi beban melalui cara lain dan menyimpan semua logika game Anda di satu server. Jadi hampir semua gim saat ini menggunakan jalur itu.


3

Ada banyak metode penyeimbangan beban server MMO, karena ada cukup banyak data yang akan diproses. Saya lebih suka metode proses bin tree.

Server global melewati koneksi pengguna ke nampan proses yang dapat menangani beberapa pengguna sekaligus. tempat sampah melakukan semua proses yang kompleks dan hanya menanggapi server global dengan data yang relevan secara global seperti obrolan global dan penentuan posisi. Metode ini menyeimbangkan jauh lebih baik daripada server wilayah, karena daerah dapat sangat bervariasi dalam populasi, sementara pemrosesan pengguna secara keseluruhan cukup bervariasi sehingga secara alami harus menyeimbangkan dirinya sendiri untuk sebagian besar.

Lakukan saja penyeimbangan beban dasar melalui server global sehingga ketika bin proses mencapai penggunaan memori / cpu tertentu, Anda memulai server bin proses baru.


Bagaimana Anda berbagi data yang dibagikan di antara nampan proses, misalnya pertarungan antara dua pengguna di nampan proses yang berbeda. Bagaimana Anda memastikan urutan acara? Sehingga pemain yang terbunuh tidak dapat melakukan serangan apa pun lagi, bahkan jika nampan yang membunuh dia lebih lambat dari nampan yang melakukan serangan. Apakah ada risiko pengiriman overhead menjadi tinggi di server global? Model proxy untuk koneksi pengguna dapat masuk ke batas sistem operasi pada tumpukan jaringan.
Hendrik Brummermann

Model ini bekerja cukup baik dalam sistem informasi di mana sebagian besar transaksi terisolasi. Maksud saya mereka biasanya tidak bekerja pada data yang sama, dan dalam kasus yang jarang digunakan penguncian atau kembalikan. Tetapi dalam permainan di mana perkelahian melibatkan banyak pemain dan / atau makhluk, dan dampak serangan dipengaruhi oleh atribut penyerang dan bek, pendekatan ini mungkin sulit.
Hendrik Brummermann

Anda bisa menggunakan cara yang mudah dan menganggap interaksi multi-pengguna menjadi relevan secara global, atau Anda dapat membuat metode sederhana agar tempat sampah saling memperhatikan dan berkomunikasi. Setiap bin proses harus mampu menangani sekitar sepuluh ribu pengguna sekaligus, jadi komunikasi negara antara pengguna seharusnya tidak terlalu menjadi masalah. Metode wilayah sedikit lebih mudah, tetapi tidak seimbang, dan dapat dengan mudah macet jika terlalu banyak pengguna memasuki wilayah yang sama. Dalam MMORPG dengan basis pengguna yang besar menyeimbangkan beban secara merata sangat penting.
Stephen Belanger

Saya ingin tahu "metode sederhana" untuk 2 tempat sampah untuk dapat menegosiasikan sistem seperti pertempuran. Masalahnya bukan komunikasi level rendah tetapi algoritma gameplay khas menjadi sangat rumit dengan peserta yang didistribusikan.
Kylotan

Dalam implementasi saya, server global saya menyimpan daftar semua klien yang terhubung dan melacak bin proses yang terhubung dengan mereka. Jika sebuah bin proses perlu mengakses pengguna lain, ia terlebih dahulu memeriksa daftar pengguna itu sendiri. Jika itu gagal, ia memeriksa daftar global dan mengidentifikasi bin proses apa yang terhubung dengan pengguna lain. Tempat sampah proses kemudian terhubung secara langsung untuk berbagi status pengguna saat melakukan pemrosesan terpadu.
Stephen Belanger
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.