Qual é a melhor arquitetura para múltiplos servidores de jogos que precisam conversar entre si?

StackOverflow https://stackoverflow.com/questions/608674

Pergunta

O jogo é um gráfico baixa (SVG) jogo estratégico. Cada servidor representa um jogo de domínio com os seus jogadores. Todos os servidores devem ser capazes de falar uns aos outros, como os jogadores podem mover (no jogo) de domínio para domínio / enviar "mensageiros diplomáticos" etc ..

Nós escolhemos esta idéia, pois nos permite ampliar o mapa do mundo sem parar, ele permite que a segunda partes para conectar seus servidores de jogo para nós e aqueles ampliar o mundo ainda mais. Se um servidor (e seus backups) falhar, o jogo ainda continuará a funcionar (um ambiente real distribuído).

Estamos apenas no início. Quais são as plataformas lá fora, que devemos olhar, que nos ajudarão a desenvolver um mundo assim?

Foi útil?

Solução

XMPP, anteriormente conhecido como Jabber, pode ser um bom lugar para começar.

Outras dicas

Uma grande parte destas depende da quantidade de dados que você deseja compartilhar entre os servidores. Você quer que cada servidor para lidar com seu próprio domínio, mas que sobre banco de dados conta, dados sobre quem possui o quê informações, topografia de domínios, são esses dados vai ser central e / ou distribuído e como você mantê-los sincronizados. Portanto, além de o funcionamento do jogo, há um outro conjunto de metadados, que os servidores precisam comunicar sobre. Quanto aos dados do jogo, você provavelmente vai passar em torno de eventos, objetos de dados e informações sobre propriedade e controle de dados. Além de tudo isso, tem de haver algum no jogo metadados relógio para manter domínios tempo sincronizado.

Eu provavelmente usaria um sistema de filas assíncronas com prioridades diferentes para metadados, solicitações e mensagens de resposta. Protocolo como XMPP no topo de troca de mensagens pode trazer-lhe informações de presença, autenticação, criptografia e outras vantagens. Mas no início, o próprio protocolo de entrega não é tão importante como a estrutura das mensagens e troca de dados. Em essência protocolos de entrega são intercambiáveis.

Exemplo : Um jogador envia uma unidade de jogo X do domínio A para o domínio servidor B. Domínio A envia mensagem com evento para servidor de domínio B. Enquanto o processamento da fila de eventos, B recebe a mensagem e envia um pedido para uma fila de solicitações em um para os dados sobre a unidade X e permissão para controle / modificar dados de unidade X. Pedido fila tem maior prioridade e serão tratadas antes de outros eventos domínio A . domínio a envia dados solicitados e controlo token para o domínio B fila de resposta com a máxima prioridade. servidor Enquanto isso domínio B já processadas 3 outros eventos, não esperando na sessão.

  • Nota: A deve obsoleto, versão ou remover dados sobre unidade X neste momento. Se uma solicitação vem para os dados do domínio C, deve encaminhar esta solicitação para o servidor B a partir de agora.
  • Nota:. O exemplo acima pode ser otimizado para enviar dados sobre unidade X diretamente com o evento correspondente, mas eu queria um exemplo simples para ilustrar

O importante é que você terá que projetar o protocolo de encapsulamento de dados, provavelmente algum esquema XML. O protocolo para o tratamento de eventos. Lista de eventos, respostas permitidos, mensagens de erro de recuperação. Essas são todas jogo específico.

Eu consideraria seriamente Erlang e CouchDB, ou implementá-lo sob Google AppEngine.

Se é verdadeiramente distribuída, então eu estou supondo que não há planos para um servidor central. Isso significa que o que você está procurando realmente é um mecanismo de comunicação entre os vários servidores. REST e XML-RPC são os dois mecanismos muito simples para os servidores de ser capaz de falar com um outro para comunicar que um usuário precisa passar de um para outro.

Você também pode usar algo como XMPP, como Daniel disse mas isso significa que você tem que ligar um outro conjunto de software de servidor na mistura ao lado de tudo o que você tem em execução o jogo em si (que eu estou supondo que a partir de sua descrição é provavelmente, um servidor de aplicações web de algum tipo).

Do ponto de vista do desenvolvimento, qualquer linguagem / framework que é forte para o desenvolvimento de aplicações web deve funcionar. Ruby on Rails, Python em Django, numerosas estruturas mais Java, ou mesmo bolo w / PHP (nojento) iria trabalhar para o trabalho de desenvolvimento.

Eu considerei algo parecido com isso no passado, mas as questões de habilitação de vários servidores (ou seja, como você lida com um servidor que é ou quebrado ou malicioso e permite que um jogador se mover simultaneamente a mesma peça em dois ou três outros servidores ), lidando com abandonaram servidores (o que acontece com os jogadores que passado existiam lá), etc. parecia muito desafiador.

Eu acho que a primeira pergunta a resposta é se o jogo é em tempo real ou evento dirigido, e se o cliente é o navegador ou não. Parece que de mas lembre-se que o servidor não pode empurrar resultados para um cliente HTML simples efetivamente, apenas para um applet Java, filme do Flash embutido, etc. Se você tem um cliente personalizado, então não há necessidade de usar event-driven um HTTP sistema de estilo no servidor, o que significa servidor-> servidor e servidor-> comunicação do cliente pode ser feito da mesma forma.

Você deve ter um olhar para os papéis "Gestão interesse" sobre jogos p2p, você irá enfrentar abordagens muito interessantes. Google Schoolar irá apresentar-lhe realmente bons papéis.

Mas esteja avisado, o desenvolvimento de aplicações distribuídas é muito mais complexo do que simples single-server-se aproxima.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top