Basis data apa yang biasanya digunakan dalam MMORPG? [Tutup]

62

Apakah orang menulis DB sendiri karena suatu alasan?

Tetrad
sumber

Jawaban:

38

Kami lakukan, semoga Ben Z akan memberikan penjelasan yang lebih baik tentang alasan daripada yang saya bisa karena dia sebenarnya penulis asli dari database kami. Versi singkatnya adalah bahwa DB relasional tidak terlalu berguna untuk game karena mereka tidak dapat secara efisien menyimpan data hierarkis terstruktur, yang membentuk sebagian besar data yang dibutuhkan MMO untuk operasi normal. Kami memilih untuk membangun basis data objek khusus dan bagian dari sistem pemrosesan transaksi terdistribusi, yang sekarang dalam produksi dan menjalankan dua game langsung kami.

Adapun jika Anda harus melakukan hal yang sama? Mungkin tidak, setidaknya tidak pada awalnya. Saya masih akan menganjurkan menghindari SQL, tetapi sekarang ada banyak pilihan di dunia "NoSQL" yang tidak ada beberapa tahun yang lalu.

Yang mengatakan, sebagian besar MMO berjalan pada database SQL (relasional). Saya tahu Eve berjalan pada instalasi SQL Server yang duduk di atas beberapa RAMSAN multi-TB (saya mungkin tidak akan pernah memiliki banyak uang dalam hidup saya dalam hal ini).

EDIT: Mudah-mudahan dia tidak keberatan saya memposting ini di sini, tapi ini adalah entri blog dengan beberapa tautan dan komentar tentang presentasi yang kami berikan di GDC'08 tentang database kami.

pembuat kode
sumber
1
+1 Saya membayangkan sebagian besar orang akhirnya menulis di sana sendiri. Tapi itu keren bahwa dunia NoSQL berkembang sekarang.
Jesse Dorsey
5
Bahkan jika Anda akhirnya sangat menyesuaikan sesuatu di kemudian hari, mungkin ada setidaknya satu DB di luar sana Anda dapat membuat prototipe.
coderanger
9
coderanger benar. Saya menulis database khusus untuk MMO. Jika saya melakukannya lagi di dunia saat ini saya mungkin akan melihat lebih dekat mengadaptasi teknologi yang ada, karena ketika ia menyebutkan bahwa dunia lebih aktif daripada 4 tahun yang lalu. Banyak MMO yang benar-benar berjalan pada SQL, beberapa di antaranya baik dan beberapa di antaranya tidak begitu baik. Konkurensi max shard (berlawanan dengan max concurrency atau benua) rendah untuk game-game tersebut.
Ben Zeigler
2
"karena mereka tidak dapat secara efisien menyimpan data hierarkis terstruktur berat, yang membentuk sebagian besar data yang dibutuhkan MMO untuk operasi normal" - itu bahkan lebih benar dalam pengembangan aplikasi daripada dalam pemrograman game. Sayangnya, kita terjebak dengan apa yang kita punya, dan karena kinerja (dan ketersediaan DBA) untuk solusi NoSQL saat ini tidak dapat menyaingi untuk RDBMS, kita harus menghancurkan dan mencoreng data kita menjadi bentuk yang bisa diterapkan untuk RDBMS.
BlueRaja - Danny Pflughoeft
1
Itu mungkin benar beberapa tahun yang lalu, tetapi sekarang ada sejumlah database yang menawarkan jenis karakteristik kinerja yang dibutuhkan.
coderanger
35

Oke jawaban ini lebih dari sekedar pengamatan.

Pengungkapan penuh Saya belum pernah bekerja di MMORPG. Saya telah bekerja di salah satu dari 10 situs paling banyak dikunjungi pada tahun 2009, dan saya telah bekerja di perusahaan mesin permainan yang berpikir mereka membuat teknologi MMORPG (saya tidak tahu apakah dikirim).

Jika Anda melihat perusahaan yang telah mencapai skala besar (Google, Facebook, Twitter, dll., Saya tahu mereka bukan perusahaan game, tetapi mereka pantas untuk dilihat di ruang ini) ada dua hal yang saya pikir penting.

  1. Mereka mulai dengan meraih apa pun yang murah dan mudah dilakukan
  2. Mereka akhirnya harus menggulung banyak teknologi mereka sendiri. (Dan terkadang perangkat keras)

Kesalahan besar adalah mengambil barang turnkey mahal dan mengharapkannya secara ajaib untuk Anda. Tidak berfungsi seperti itu. Kunci untuk meningkatkan adalah menangani setiap tantangan baru dengan tepat. Anda membutuhkan solusi fleksibel yang mudah digunakan sehingga Anda dapat bergerak masuk dan keluar dengan mudah.

Jadi saran saya untuk Anda adalah jika Anda memulai, hanya mendapatkan apa yang tampaknya paling sulit untuk dihadapi.

Jonathan Fischoff
sumber
25

Pada dasarnya, ada berbagai macam pendekatan, dan saya pikir mereka lebih dipilih berdasarkan pengalaman pengembang mereka serta sifat-sifat database. Di satu sisi, banyak MMO menggunakan database relasional standar - misalnya. Abad Gelap Camelot digunakan / digunakan (apakah masih berjalan?) MySQL , FreeRealms menggunakan Postgresql yang dimodifikasi , dll.

Bergerak sepanjang skala, Anda memiliki Perang Guild: mereka menggunakan SQL Server , tetapi mereka menempel data mereka di sana sebagai satu Gumpalan. Ini berarti mereka mendapatkan manfaat dari format biner mereka yang biasa dengan beberapa manfaat yang disediakan oleh basis data. Tidak perlu dikatakan, Anda mungkin dapat melihat beberapa kelemahan dari pendekatan ini juga, tetapi untuk perusahaan yang terbiasa bekerja dengan file flat, itu mungkin masih merupakan langkah maju.

Kemudian mungkin ada beberapa tempat menggunakan berbagai pendekatan NoSQL yang diformalkan, meskipun masih awal. Farmville menggunakan membase , yang mereka buat untuk tujuan itu, berdasarkan memcached rupanya. Ini berbagi banyak fitur dengan orang-orang seperti MongoDB, CouchDB, dll. Sekali lagi dengan pendekatan ini Anda biasanya menggulung format penyimpanan Anda sendiri tetapi mendapatkan manfaat dari distribusi, caching, redundansi, dll.

Beberapa menggulirkan NoSQL mereka sendiri sepenuhnya: Cryptic mengatakan mereka melakukan sesuatu yang serupa tetapi juga mengatakan mereka tidak menggunakannya dalam produksi. ( EDIT : tetapi lihat komentar di bawah.)

Dan kemudian Anda datang ke orang-orang yang menggunakan teks datar atau file biner - seperti yang saya pahami, game yang lebih tua seperti Ultima Online, Everquest, dll. Semuanya berjalan di jalur ini, dan untuk perusahaan dengan pengalaman pengembangan game tetapi sedikit pengalaman database ini bekerja dengan baik terlalu.

Perhatikan juga bahwa Anda hampir tidak pernah menulis database Anda sendiri dalam pengertian istilah yang longgar - dalam gim Anda akan selalu memiliki data yang dipesan lebih dahulu yang perlu Anda kelola baik di memori atau di-disk dengan cara yang tidak meminjamkan diri mereka sendiri ke perangkat lunak generik. Anda tidak dapat melakukan kueri SQL setiap kali Anda menginginkan beberapa data sehingga Anda harus mem-mirroring banyak informasi Anda dalam kode tidak peduli apa pun back end yang Anda gunakan.

Kylotan
sumber
1
Jika Anda menyimpannya di memori, Anda perlu mengimplementasikan database di dalam memori, atau Anda berisiko mengalami duplikasi / kehilangan item (sebagai contoh) ketika melakukan perdagangan lintas zona. "Simpan di memori" hanya berfungsi selama semua pemain Anda berada dalam ruang memori yang sama sepanjang waktu.
1
Meskipun itu berlaku untuk waktu online dan hitpoint, tidak ada yang dijamin ACID di DB Cryptic, itu tidak berlaku untuk mis tonggak pencarian (5/10 serigala tewas) atau hadiah XP, yang masih dapat terjadi beberapa kali per detik per pemain.
1
Mereka tidak perlu semantik transaksional jika Anda baik-baik saja berurusan dengan pengguna yang kehilangan kemajuan pencarian mereka jika server turun. Dalam hal hadiah XP, itu bisa berarti kehilangan satu level, dan ketika sebuah game crash dan Anda kehilangan satu level, langkah selanjutnya biasanya berhenti bermain.
6
XP sangat perlu ditransaksikan. Salah satu eksploit spesifik yang mengarah pada penciptaan CrypticDB di tempat pertama (percayalah, saya menulisnya) melibatkan XP gain pada beberapa server sekaligus dan sinkronisasi gagal yang pengguna interruptible. Apa pun yang penting untuk perkembangan karakter benar-benar perlu ditransaksikan, jika tidak, pemain akan menemukan cara untuk mengeksploitasi.
Ben Zeigler
1
@ Expiredninja: itu pertanyaan yang sangat terbuka. Tetapi dengan 'flatfile' itu hanya berarti "serialisasi sewenang-wenang ke disk". Pengembang game sering menulis setiap bidang dengan fprintf, misalnya.
Kylotan
10

Pada Pirates of the Burning Sea, kami menatap dengan MySQL (meskipun jujur ​​saya lebih suka Postgres) dan ketika mulai jatuh di bawah beban, kami beralih ke Microsoft SQL Server. Sejujurnya, saya mungkin tidak akan pergi ke rute itu lagi di masa depan. Sebagian besar data PotBS adalah pra-serialisasi sebelum itu tetap ada, jadi sebagian besar dari apa yang ada di DB tidak lebih dari penyimpanan kunci / nilai yang ditumbuhi. Selain itu, untuk mendapatkan kinerja yang lebih baik dari lapisan ketekunan kami, dan kontrol yang lebih baik tentang bagaimana data di-cache dalam memori, kami akhirnya menulis server caching yang duduk di depan database.

Jadi Kylotan sangat benar, Anda tidak akan berkeliling untuk menggulirkan Anda sendiri pada tingkat tertentu. Server database relasional SQL tidak dirancang untuk cara game menggunakan data. Alih-alih mengasumsikan server DB relasional adalah akhir dari semua database, kita benar-benar harus lebih memikirkan manfaat apa yang kita cari sebelum memilih alat.

Lain kali, saya akan melihat lebih dalam hal-hal seperti BerkleyDB atau beberapa DB gaya NoSQL lainnya.

justinian
sumber
10

Satu hal lagi yang perlu diperhatikan adalah bahwa jika Anda memiliki kumpulan data statis (relatif), jangan menyimpannya dalam basis data! Tidak ada alasan yang sangat baik untuk menyimpan definisi ejaan Anda, definisi item, peta, dll. Dalam database. Anda jarang menanyakannya kecuali dengan nama. Saya melihat banyak orang terjun ke dalam pengembangan game menyimpan hal-hal ini tepat di samping data pemain yang bertahan, dan itu adalah kelas yang sangat berbeda.

Anda memerlukan penyimpanan data, seperti sistem file, untuk ini. Di luar pengembangan, Anda tidak perlu ACID, Anda tidak perlu CRUD, Anda tidak perlu database untuk data semacam itu. Di dalam pengembangan, Anda memerlukan database, tetapi Anda juga tetap membutuhkan VCS, dan VCS pilihan Anda akan membuat pilihan database untuk Anda.

(Jika Anda bekerja pada gim di mana pemain dapat membuat mantra atau item atau quest khusus, yah, maka data itu sama dengan data pemain, dan Anda memang membutuhkan database lagi.)


sumber
5

MMORPG adalah aplikasi intensif dan merupakan tugas besar. Jika Anda memulai dengan pengembangan game, saya sangat menyarankan Anda melakukan sesuatu yang lebih kecil.

Yang mengatakan Anda akan perlu dua memeras kinerja teratas dari pengaturan Anda. Anda jelas akan membutuhkan server farm / hive. Karena komunikasi jaringan relatif mahal (dan sebagian besar MMORPG bersifat realtime), Anda mungkin ingin mereplikasi basis data pusat Anda ke setiap server gim Anda (setara dengan replikasi latensi rendah real-time dalam basis data pilihan Anda).

Jika masing-masing server Anda melayani segmen tertentu dari dunia game (seperti WoW berfungsi); sesuatu seperti Tampilan Dipartisi Terdistribusi . DPV memungkinkan Anda untuk mengelompokkan baris-baris database Anda di berbagai server; sesuai dengan kendala pada kolom di setiap server. MSSQL dan Oracle cukup pintar untuk hanya berbicara dengan server yang berisi data yang termasuk dalam klausa WHERE atau ON Anda. Saya tidak yakin apakah ada tawaran open source yang memiliki DPV.

Hasil bersih dari semua ini adalah tidak masalah DB apa yang Anda gunakan , cukup gunakan satu dengan nama baik: MSSQL, Oracle, MySQL, PostgreSQL. Tulis basis data Anda dalam ANSI SQL dan lihat sistem mana yang bekerja paling baik - itulah satu-satunya cara untuk mengetahuinya.

Rute NoSQL mungkin juga ide yang bagus karena dirancang untuk konkurensi tinggi. Saran Pranny mungkin berhasil.

Jonathan Dickinson
sumber
5

Saya telah menggunakan MongoDB (NoSQL), ini adalah toko dokumen yang sangat cepat yang dapat diakses melalui TCP. Cobalah! Itu mengagumkan!

Menulis DB Anda sendiri adalah tugas yang menakutkan. Saya sarankan Anda terlebih dahulu mengeksplorasi apa yang sudah ada di luar sana dan jika Anda tidak dapat menemukan hal yang cocok dengan kriteria spesifik Anda, buat sendiri. Oh, dan jangan lupa untuk membukanya. :)

Ariejan
sumber
0

Saya kira itu sangat tergantung pada jenis data apa yang perlu Anda simpan, dan dalam bentuk apa.

Saya pikir sebagian besar orang di luar sana menggunakan database SQL "standar" untuk data "dinamis" seperti informasi pemain, baik itu SQL Server, MySQL, PostgreSQL.

Namun, data "internal" (keadaan dunia, konten, ....) dapat disimpan dalam bentuk apa pun, dan tebakan saya adalah bahwa sebagian besar perusahaan menulis setidaknya sebagian sistem database kustom untuk bagian itu, cocok untuk kebutuhan spesifik mereka. .

Axelle Ziegler
sumber
0

Yah, itu sebenarnya tergantung pada aplikasi Anda - itulah intinya. Saya bekerja, tempat kami mengembangkan RPG sosial dan kami menggunakan Google App Engine sebagai backend

pr4n
sumber
0

Pertanyaan ini agak lama tetapi Ide saya tentang bagaimana menanganinya sama validnya seperti yang ditanyakan hari ini.

Jika Anda menggunakan basis data relasional, Anda perlu mengurangi bebannya sehingga ide ini akan membantu.

Simpan semua info publik pada DB lokal di setiap sistem klien dan juga di server DB.

Simpan semua tabel dengan item pada basis data klien. Alih-alih klien mencari ke server ketika Anda mengarahkan senjata ke statistik, klien hanya memeriksa statistik lokal untuk statistik. Server memiliki database sendiri untuk menarik statistik saat menghitung dan hanya meneruskan kerusakan dan kesehatan yang tersisa kepada klien.

Kasus terburuk dengan ide ini adalah bahwa setiap orang dapat melihat statistik semua senjata jika mereka berhasil masuk ke basis data klien. tidak masalah meskipun menyebabkan bahkan jika mereka mengubah nilai-nilai, nilai-nilai database di server adalah apa yang menghitung dalam permainan.

FissionFlame
sumber
1
Setelah Anda menyimpan semua informasi itu secara lokal seperti itu, tidak perlu ada dalam database sama sekali.
Josh