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.
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.
sumber
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":
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.
sumber
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.
sumber