Informações sobre a arquitetura perfeita do servidor MMO

9

Estou procurando qualquer material em servidores MMO sem costura! Eu tenho alguns artigos nos livros "Massively Multiplayer Game Development" e "Game Programming Gems 5." Alguém já experimentou esse tópico ou conhece artigos sobre isso?

Estou interessado em "visualizações de alto nível" e em implementações. Isso pode se tornar o tópico da minha tese de mestrado e eu gostaria de descobrir o quão difícil é escrever um sistema assim, antes de realmente começar a tese. No momento, ainda não decidi qual idioma usar, estou pensando em Java ou Scala. Erlang pode ser uma escolha, mas nunca trabalhei com isso.

Nota: O requisito básico seria movimento. Quaisquer outros sistemas de jogos são opcionais e fornecem "crédito de bônus".

Agora, o que quero dizer com "servidor sem costura": quero configurar um cluster de servidores em que cada nó controla alguma parte do mundo do jogo, com limites estáticos. Os jogadores agora podem se mover de um extremo ao outro do mundo sem mudar de instância ou atingir algum "teleporter". Eu acho que WoW faz isso. No meu back-end, no entanto, o player faz a transição de um servidor para o outro.

Lurca
fonte
Há algum tempo, li que cada servidor WoW contém mais de 5 blades - 1 para cada continente e o banco de dados. Também costumavam ser as masmorras e os campos de batalha, embora eu assuma que agora eles residem em seus próprios clusters para permitir conexões entre regiões. Em resumo, os continentes são mantidos em um servidor - não há um ponto em que você faça a transição para outro servidor, a menos que você mude de continente.
Leniência
Interessante, você se lembra de onde leu isso? Como eu disse, nunca reproduzo WoW e não sei o tamanho dos continentes, mas não consigo imaginar que cada continente esteja hospedado em um servidor separado.
Lurca
3
Estatísticas de servidor WoW: 13.250 blades de servidor total, 75.000 núcleos de CPU total, 112,5 terabytes de RAM (a partir do GDC Austin 09). Veja aqui ; não necessariamente todos dedicados ao WoW, mas razoavelmente perto o suficiente.
Josh Petrie: Obrigado, encontrei este artigo no início deste dia. Mas ainda estou procurando coisas sobre arquitetura de servidor contínua ou contínua.
Lurca
11
Relacionados Como é alcançado o balanceamento de carga nos MMOs?
Hendrik Brummermann

Respostas:

5

A principal complexidade no gerenciamento de um sistema desse tipo vem do quão uniforme você precisa. Como Josh disse, resolver o problema de entregar uma entidade de um servidor para outro é uma parte essencial do pacote.

Porém, esse não é o único problema - se as entidades em vários servidores precisarem interagir como parte de uma operação, agora você terá um problema de sincronização em que cada sistema precisa de dados do outro lado para prosseguir, mas quando os dados chegarem, poderá já é inválido. Você pode tentar resolver isso dividindo a operação em várias mensagens com capacidade de reversão, se um lado voltar, mas como você viu no Capítulo 3.1 em "Desenvolvimento maciço de jogos para múltiplos jogadores", isso complica significativamente qualquer lógica de jogo necessária. faça isso com. Scala e Erlang ajudam você a acertar o sistema de mensagens - eles não ajudam na decomposição do que costumava ser uma função de 10 linhas nas diversas mensagens e estados diferentes que você agora precisa rastrear.

Obviamente, esse problema não é totalmente novo, e os bancos de dados relacionais suportam esse tipo de problema, armazenando todos os dados centralmente e permitindo que vários clientes consultem e alterem conforme necessário, revertendo as transações quando necessário. Isso fornece a maioria dos requisitos de correção, mas infelizmente impõe problemas de desempenho impraticáveis, além de dificultar a implementação da lógica do jogo (uma vez que grande parte da sua lógica agora está escrita em procedimentos armazenados no banco de dados). Um tipo diferente de banco de dados pode fornecer uma boa solução aqui, especialmente se você estiver disposto a trocar os requisitos de confiabilidade que a maioria dos RDBMSs fornece.

A maioria dos jogos profissionais soluciona esse problema nem mesmo tentando, mantendo o tamanho do fragmento pequeno o suficiente para colocar todos os jogadores em um servidor, dividindo o mundo em partes que realmente não interagem (veja o exemplo do WoW nos comentários acima) , ou distribuindo o jogo entre servidores com base na função e não na geografia (por exemplo, todo combate acontece em um servidor, todos conversam em outro), para que não haja 'costuras' para enfrentar.

Kylotan
fonte
3

Estou interessado em "visualizações de alto nível" e em implementações.

As implementações geralmente são razoavelmente profundamente envolvidas e você provavelmente não verá muita conversa sobre elas aqui. O software StackExchange não é adequado para esse tipo de discussão envolvida, sem mencionar que envolveria um investimento significativo do tempo de alguém.

Eu gostaria de descobrir como é difícil escrever um sistema assim

Não é mais ou menos difícil do que qualquer outro sistema: ele dependerá de seus requisitos e dos recursos que você pretende dirigir. Você pode escrever implementações triviais trivialmente, mas coisas não triviais serão muito mais difíceis. Um dos maiores problemas é que você provavelmente não terá clientes reais suficientes para saber se o seu sistema realmente é escalado para o nível "maciço" em que o WoW e outros jogos operam.

MMOs não são mágicos. A maior parte de sua tecnologia não é nada de especial quando isolada, é simplesmente que vários bits menores e mais simples de tecnologia são combinados de maneira muito inteligente para permitir simulações paralelas em maior escala e conectadas de algum estado mundial compartilhado.

Eu quero configurar um cluster de servidores em que cada nó controla alguma parte do mundo do jogo, com limites estáticos. Os jogadores agora podem se mover de um extremo ao outro do mundo sem mudar de instância ou atingir algum "teleporter".

Basicamente, o que você está falando é a transferência da simulação. Isso pode ser feito de maneira simples e não é necessariamente uma tecnologia específica para MMO (jogos ponto a ponto tendem a suportar todos os mesmos mecanismos subjacentes para implementar a migração de host). A premissa básica é fazer com que cada servidor entenda a topologia dos servidores "ao seu redor" (especificamente, um servidor para o nó mundial A deve conhecer os servidores dos nós mundiais adjacentes à simulação), bem como definir um buffer em torno do qual você considere uma entidade simulada específica "fecha" a um servidor adjacente.

Quando uma entidade entra no buffer de "fechamento", você também começa a reportá-lo ao servidor adjacente. Depois que a entidade cruza o limite real, você envia uma mensagem ao servidor adjacente com o estado completo da entidade e uma mensagem indicando que o servidor adjacente deve assumir o controle da entidade. Obviamente, você quer que isso seja o mais confiável possível.


fonte