Que tipo de banco de dados geralmente é usado em um MMORPG? [fechadas]

62

As pessoas escrevem seu próprio banco de dados por algum motivo?

Tetrad
fonte

Respostas:

38

Sim, esperamos que Ben Z dê uma explicação melhor dos motivos do que eu, uma vez que ele era realmente o autor original do nosso banco de dados. A versão curta é que os bancos de dados relacionais não são muito úteis para jogos porque não podem armazenar com eficiência dados hierárquicos fortemente estruturados, o que compõe a grande maioria dos dados que um MMO precisa para operar normalmente. Optamos por criar um banco de dados de objetos personalizados e parte de um sistema de processamento de transações distribuídas, que agora está em produção e alimentando nossos dois jogos ao vivo.

Quanto a se você deveria fazer o mesmo? Provavelmente não, pelo menos não a princípio. Eu ainda advogaria evitar o SQL, mas agora existem muito mais opções no mundo "NoSQL" que não existiam há alguns anos atrás.

Dito isto, a maioria dos MMOs são executados em bancos de dados SQL (relacionais). Sei que Eve é executada em uma instalação do SQL Server em cima de alguns RAMSANs com vários TB (provavelmente nunca na minha vida terei tanto dinheiro quanto essas coisas custam).

EDIT: Espero que ele não se importe de eu postar isso aqui, mas esta é uma entrada de blog com alguns links e comentários sobre a apresentação que fizemos no GDC'08 sobre nosso banco de dados.

coderanger
fonte
1
+1 Eu imagino que a maioria das pessoas acabou escrevendo lá próprio banco de dados. Mas é legal que o mundo NoSQL esteja crescendo agora.
Jesse Dorsey
5
Mesmo que você acabe personalizando muito mais tarde, provavelmente há pelo menos um banco de dados no qual você pode criar protótipos.
Coderanger
9
coderanger está certo. Eu escrevi um banco de dados personalizado para um MMO. Se eu fizesse isso de novo no mundo de hoje, provavelmente analisaria mais de perto a adaptação da tecnologia existente, porque, como ele menciona, o mundo é mais ativo do que há quatro anos. De fato, muitos MMOs são executados no SQL, alguns deles bem e outros não muito bem. A concorrência máxima de shard (em oposição à concorrência máxima da zona ou do continente) é baixa para esses jogos.
precisa
2
"porque eles não conseguem armazenar com eficiência dados hierárquicos fortemente estruturados, o que compõe a grande maioria dos dados que um MMO precisa para a operação normal" - isso é ainda mais verdadeiro no desenvolvimento de aplicativos do que na programação de jogos. Infelizmente, estamos presos ao que temos e, como o desempenho (e a disponibilidade dos DBAs) das soluções NoSQL atualmente não podem corresponder ao dos RDBMSs, precisamos compactar e borrar nossos dados em um formato viável para RDBMS's.
BlueRaja - Danny Pflughoeft
1
Isso pode ter sido verdade há vários anos, mas agora existem vários bancos de dados disponíveis que oferecem o tipo de características de desempenho necessárias.
Coderanger
35

Ok, esta resposta é mais uma observação.

Divulgação completa Não trabalhei no MMORPG. Eu trabalhei em um dos 10 sites mais visitados em 2009, e trabalhei em uma empresa de motores de jogos que pensava estar desenvolvendo tecnologia MMORPG (não sei se foi lançada).

Se você olhar para empresas que alcançaram uma escala maciça (Google, Facebook, Twitter etc.), sei que não são empresas de jogos, mas vale a pena olhar neste espaço), há duas coisas que considero importantes.

  1. Eles começaram pegando tudo o que era barato e fácil para seguir em frente
  2. Eles finalmente tiveram que usar muita tecnologia por conta própria. (E às vezes hardware)

Um grande erro é pegar alguma coisa cara na mão e esperar que ela seja magicamente escalável para você. Não é assim que funciona. A chave para expandir é lidar com cada novo desafio adequadamente. Você precisa de soluções flexíveis e fáceis de usar, nas quais possa entrar e sair facilmente.

Então, meu conselho para você seria se você estivesse começando, apenas tenha o que parece menos dor de cabeça para lidar.

Jonathan Fischoff
fonte
25

Basicamente, há toda uma gama de abordagens, e acho que elas são escolhidas com base mais nas experiências de seus desenvolvedores e nas propriedades do banco de dados. Em uma extremidade, muitos MMOs estão usando bancos de dados relacionais padrão - por exemplo. Dark Ages of Camelot usou / usa (eles ainda estão indo?) MySQL , FreeRealms usam um Postgresql modificado , etc.

Movendo-se ao longo da escala, você tem Guild Wars: eles usam o SQL Server , mas colam seus dados como um único BLOB. Isso significa que eles obtêm os benefícios de seus formatos binários usuais com alguns dos benefícios que um banco de dados fornece. Escusado será dizer que você provavelmente também pode ver algumas desvantagens dessa abordagem, mas para uma empresa acostumada a trabalhar com arquivos simples, provavelmente ainda é um avanço.

Provavelmente existem alguns lugares usando as várias abordagens formalizadas do NoSQL, embora ainda seja cedo. Farmville usa o membase , que eles criaram para esse fim, aparentemente baseado no memcached. Isso compartilha muitos recursos com o MongoDB, CouchDB, etc. Novamente, com essas abordagens, você normalmente lança seus próprios formatos de armazenamento, mas obtém os benefícios de distribuição, armazenamento em cache, redundância etc.

Alguns estão lançando seu próprio NoSQL inteiramente: a Cryptic disse que fez algo semelhante, mas também disse que não o estava usando na produção. ( EDIT : mas veja os comentários abaixo.)

E você chega a pessoas que usam texto simples ou arquivos binários - como eu entendo, os jogos mais antigos, como Ultima Online, Everquest, etc, seguiram esse caminho e, para uma empresa com experiência em desenvolvimento de jogos, mas pouca experiência em banco de dados, isso funciona bem também.

Observe também que você quase nunca escreve seu próprio banco de dados em algum sentido genérico do termo - em jogos, você sempre terá dados personalizados que você precisa gerenciar na memória ou no disco de maneiras que não se prestam para software genérico. Você não pode fazer consultas SQL toda vez que quiser alguns dados, portanto, você deve espelhar muitas informações no código, independentemente do backend usado.

Kylotan
fonte
1
Se você os mantiver na memória, precisará implementar um banco de dados na memória ou corre o risco de duplicação / perda do item (como exemplo) ao negociar entre zonas. "Mantê-los na memória" só funciona enquanto todos os seus jogadores estiverem no mesmo espaço de memória o tempo todo.
1
Embora isso seja verdade no tempo on-line e nos pontos de vida, nenhum dos quais foi garantido ACID no banco de dados da Cryptic, isso não é verdade, por exemplo, marcos da missão (5/10 lobos mortos) ou recompensas XP, que ainda podem ocorrer muitas vezes por segundo por jogador.
1
Eles não precisam de semântica transacional se você estiver bem em lidar com usuários que perdem o progresso de suas missões se o servidor cair. No caso das recompensas XP, isso pode significar perder um nível e, quando um jogo trava e você perde um nível, o próximo passo é parar de jogar.
6
O XP precisa muito ser negociado. Uma das explorações específicas que levaram à criação do CrypticDB em primeiro lugar (acredite, escrevi) envolveu o ganho de XP em vários servidores ao mesmo tempo e uma falha na sincronização que era interrompida pelo usuário. Qualquer coisa que seja crítica para a progressão de um personagem realmente precisa ser transacionada, caso contrário, os jogadores encontrarão uma maneira de explorar.
Ben Zeigler
1
@expiredninja: essa é uma pergunta muito aberta. Mas por 'flatfile' significa apenas "serialização arbitrária em disco". Os desenvolvedores de jogos costumavam escrever cada campo com o fprintf, por exemplo.
Kylotan
10

Em Pirates of the Burning Sea, observamos o MySQL (embora honestamente eu preferisse o Postgres) e, quando começou a cair sob carga, mudamos para o Microsoft SQL Server. Honestamente, porém, provavelmente não vou seguir esse caminho novamente no futuro. A maioria dos dados do PotBS é pré-serializada antes de persistir, de modo que uma grande parte do que está no banco de dados nada mais é do que um armazenamento de chave / valor super crescido. Além disso, para obter melhor desempenho de nossa camada de persistência e melhor controle de como os dados foram armazenados em cache na memória, acabamos escrevendo um servidor de cache que ficava na frente do banco de dados.

Então, Kylotan está muito certo, você não vai se dar bem em algum nível. Os servidores de banco de dados relacional SQL não foram projetados para a maneira como os jogos usam dados. Em vez de assumir que os servidores de banco de dados relacional eram o final de todos os bancos de dados, realmente deveríamos ter pensado mais sobre quais benefícios estávamos procurando antes de escolher uma ferramenta.

Na próxima vez, examinarei mais coisas como o BerkleyDB ou alguns dos outros bancos de dados no estilo NoSQL.

justiniano
fonte
10

Outra coisa a observar é que, se você tiver um conjunto de dados (relativamente) estático, não o armazene em um banco de dados! Não há realmente uma boa razão para armazenar suas definições de feitiços, definições de itens, mapas etc. em um banco de dados. Você raramente os consulta, exceto pelo nome. Vejo muitas pessoas entrando no desenvolvimento de jogos armazenando essas coisas junto com os dados persistentes dos jogadores, e é uma classe de coisas totalmente diferente.

Você precisa de um armazenamento de dados, como um sistema de arquivos, para isso. Fora do desenvolvimento, você não precisa de ACID, não precisa de CRUD, não precisa de um banco de dados para esse tipo de dados. Dentro do desenvolvimento, você precisa de um banco de dados, mas também precisa de um VCS, e sua escolha do VCS fará essa escolha de banco de dados para você.

(Se você está trabalhando em um jogo em que os jogadores podem criar magias, itens ou missões personalizados, bem, esses dados são do mesmo tipo que os dados dos jogadores e você precisa de um banco de dados novamente.)


fonte
5

Os MMORPGs são aplicativos intensivos e são um grande empreendimento. Se você está começando com o desenvolvimento de jogos, eu recomendo fortemente que você faça algo menor.

Dito isto, você precisará de dois desempenho squeeze superior fora da sua configuração. Obviamente, você precisará de um farm / seção de servidores. Como a comunicação em rede é relativamente cara (e a maioria dos MMORPGs é em tempo real), convém replicar o banco de dados central para cada servidor de jogo (o equivalente à replicação de baixa latência em tempo real no banco de dados de sua escolha).

Se cada um de seus servidores estiver atendendo a um segmento específico do mundo do jogo (como o WoW funciona); algo como Exibições Particionadas Distribuídas . Os DPVs permitem segmentar linhas do seu banco de dados em diferentes servidores; de acordo com as restrições nas colunas em cada servidor. O MSSQL e o Oracle são inteligentes o suficiente para conversar apenas com o servidor que contém os dados que se enquadram na sua cláusula WHERE ou ON. Não tenho certeza se alguma das ofertas de código aberto tem DPVs.

O resultado final de tudo isso é que não importa qual banco de dados você usa , basta usar um com um bom nome: MSSQL, Oracle, MySQL, PostgreSQL. Escreva seu banco de dados em ANSI SQL e veja qual sistema funciona melhor - essa é a única maneira de descobrir.

A rota NoSQL também pode ser uma boa ideia, pois foi projetada para alta simultaneidade. A sugestão de Pranny pode ajudar.

Jonathan Dickinson
fonte
5

Eu usei o MongoDB (NoSQL), é um armazenamento de documentos muito rápido que pode ser acessado através de TCP. De uma chance! É incrivel!

Escrever seu próprio banco de dados é uma tarefa assustadora. Sugiro que você primeiro explore o que já existe e, se não conseguir encontrar algo que atenda ao seu conjunto específico de critérios, crie seu próprio. Ah, e não se esqueça de abrir o código-fonte. :)

Ariejan
fonte
0

Eu acho que depende muito do tipo de dados que você precisa armazenar e sob qual formulário.

Eu acho que a maioria das pessoas por aí usa bancos de dados SQL "padrão" para dados "dinâmicos", como informações sobre jogadores, seja SQL Server, MySQL, PostgreSQL.

No entanto, dados "internos" (estado do mundo, conteúdo, ....) podem ser armazenados de qualquer forma, e acho que a maioria das empresas escreve pelo menos parcialmente sistemas de bancos de dados personalizados para essa parte, adequados às suas necessidades específicas .

Axelle Ziegler
fonte
0

Bem, isso realmente depende da sua aplicação - essa é a base. Eu trabalho, onde desenvolvemos RPGs sociais e usamos o Google App Engine como back-end

pr4n
fonte
0

Esta questão é bastante antiga, mas minha idéia de como lidar com isso é tão válida quanto foi solicitada hoje.

Se você estiver usando um banco de dados relacional, precisará reduzir a carga nele, para que essa ideia ajude.

Armazene todas as informações públicas em um banco de dados local em cada sistema cliente, bem como no banco de dados do servidor.

Armazene todas as tabelas com itens no banco de dados do cliente. Em vez de o cliente procurar no servidor quando você passa o mouse sobre essa arma por estatísticas, o cliente apenas verifica o banco de dados local quanto a estatísticas. O servidor possui seu próprio banco de dados para obter estatísticas ao calcular e encaminhar os danos e a saúde restantes para os clientes.

O pior caso com essa idéia é que todos podem ver as estatísticas de todas as armas se conseguirem entrar no banco de dados de clientes. não importa o que causa, mesmo que eles alterem os valores, os valores do banco de dados no servidor são os que calculam no jogo.

FissionFlame
fonte
1
Depois de armazenar todas essas informações localmente dessa maneira, elas não precisam estar em um banco de dados.
Josh