Saya sedang mengembangkan game Real-Time yang seharusnya menampung ribuan pemain secara real-time (seperti FPS. Max 1s lag). Apa infrastruktur terbaik untuk ini?
Ide saya menggunakan 2 cluster server - satu untuk Server End (semua sisi komputasi) dan satu untuk Database, di mana load balancer "bertanggung jawab" untuk masing-masing cluster. Satu server utama akan menerima permintaan dari pengguna dan mengirimkan kembali alamat IP dari server terkait yang dapat digunakan oleh pengguna ini.
Cluster database akan menggunakan replikasi database untuk konsistensi antara database.
Harus ada penyeimbang beban geografis juga - jadi ini akan menetapkan penyeimbang beban regional untuk setiap pengguna untuk respons terbaik.
Saya menggunakan .NET + MSSQL untuk game.
Terima kasih!
sumber
Jawaban:
Tidak ada arsitektur terbaik tanpa mengetahui lebih banyak tentang persyaratan Anda, mis. jenis interaksi antar karakter, berapa banyak data yang akan bertahan, dan sebagainya.
Jika Anda dapat mengatasi latensi 1 detik, Anda mungkin dapat meng-host 1000 pemain di server tunggal tanpa masalah - tetapi itu sebenarnya bertentangan dengan ide FPS karena mereka biasanya membutuhkan latensi yang jauh lebih rendah, misalnya. kurang dari 100 ms. Tetapi sistem yang dapat menangani latensi tinggi mampu melakukan semuanya melalui pesan yang membuat konsistensi cukup sepele. Memberikan logika Anda cukup sederhana, yaitu - logika kompleks menjadi lebih buruk ketika Anda mengubahnya menjadi sistem berbasis pesan daripada sistem objek-terkunci - tetapi semuanya tergantung pada kebutuhan aplikasi Anda.
Demikian pula, jika Anda tidak memiliki banyak data, Anda tidak perlu mesin database sama sekali, tetapi tanpa menyadarinya, sulit untuk mengatakannya. Jika Anda bertahan dalam jumlah kecil data, dan mungkin hanya melakukannya pada akhir turnamen atau sesuatu, sekali lagi Anda tidak memerlukan database terpisah, tentu saja bukan sekelompok mereka. Di sisi lain, jika Anda tidak banyak membaca tetapi banyak membaca, di situlah basis data yang direplikasi dapat membantu Anda - tetapi juga menunjukkan bahwa basis data relasional mungkin bukan yang paling cocok untuk masalah Anda. Seringkali cache dalam memori adalah solusi yang lebih baik. Demikian pula, jika tidak ada interaksi gaya transaksi antara karakter, maka konsistensi menjadi kurang penting. (Dan jika hanya ada beberapa transaksi seperti itu, Anda dapat menjadikannya sebagai kasus khusus.)
Bahkan, berhati-hatilah dalam mengadopsi RDBMS hanya karena itu adalah hal yang dilakukan dalam sistem besar. Meskipun saya pribadi setuju untuk menggunakannya dalam game online, yang terbaik adalah melihat kebutuhan Anda dan mencari tahu strategi kegigihan Anda dari itu, daripada mengambil database pilihan Anda dan kemudian mencoba untuk men-tweak dengan cache dan replikasi agar sesuai dengan kebutuhan Anda aplikasi. Anda mungkin menemukan bahwa yang Anda butuhkan adalah kemampuan pelaporan offline, dalam hal ini mungkin yang terbaik untuk memiliki proses latar belakang masuk dari mekanisme kegigihan game Anda ke RDBMS jarak jauh di tempat lain.
sumber
Penafian: pengalaman pemrograman gim saya didasarkan pada gim pemain tunggal sisi-klien, tetapi saya memiliki latar belakang dalam aplikasi web (khususnya pada tumpukan Microsoft), jadi dari sanalah saya berasal dengan jawaban ini, saya merasa bahwa banyak yang akan berlaku, tetapi tanpa pengujian server game sebenarnya sulit untuk mengatakan bagaimana itu akan berlaku, tapi begini. Ketahuilah ini: Saya belum menggunakan server game, hanya webapps.
Saya akan menyarankan pendekatan dua (server). Tingkat basis data dan tingkat "aplikasi"; dengan tingkat ketiga (presentasi) menjadi klien gim Anda.
Database relasional, hebat dalam query data, dan layak dalam menulis data. Kuncinya adalah untuk membuat serialisasi penulisan database Anda menjadi potongan ukuran yang dapat dikelola yang dapat ditangani oleh kluster Anda. Edisi yang lebih canggih (Pusat data / Perusahaan) dari SQL Server mendukung pengelompokan dan replikasi. Saya akan mulai dengan membangun sebuah cluster kecil dan menjalankan beberapa pertanyaan untuk mengetahui cara kerjanya.
Di tier aplikasi, jika Anda melakukan "zonasi" atau sesuatu yang serupa, Anda mungkin bisa pergi tanpa mengatur cluster apa pun, dan cukup menyiapkan server per zona. Jika zona Anda menjadi besar, Anda bisa menyiapkan cluster untuk setiap zona.
Anda akan ingin membangun proses serialisasi untuk mengirim data dari tingkat aplikasi -> tingkat basis data. Kuncinya adalah memiliki beberapa tingkat serialisasi yang terjadi. Sesuatu seperti ini:
Ini akan membuat tulisan Anda konsisten dan dapat diprediksi, tergantung pada sifat permainan Anda, Anda bisa menulis database yang jarang. Kuncinya adalah menyadari bahwa jika server aplikasi Anda macet, Anda harus kembali online dari status di basis data Anda, sehingga membuat serialisasi inventaris pemain setiap 90 menit mungkin membuat pemain kesal.
Untuk membaca data, Anda harus memuat sebanyak mungkin ke dalam memori di tingkat aplikasi sebanyak mungkin, lalu pastikan bahwa semua kode Anda menggunakan kumpulan memori ini, di latar belakang Anda dapat menyinkronkan kumpulan memori dengan database. Seperti yang ditunjukkan oleh Joe, akan ada saatnya Anda membutuhkan transaksi "real-time". Dengan membuat serial sebagian besar tulisan Anda, Anda masih harus memiliki IO yang cukup pada database Anda untuk melakukan transaksi real-time bila perlu, dengan anggapan hardware yang memadai pada server database / cluster.
sumber