MMORPGs, alguns MOBAs como League of Legends ou mesmo StarCraft 2 geralmente o forçam a escolher um servidor. Geralmente eles são EUA, UE e MAR, em MMORPGs muitos por local. Percebo que isso era necessário há alguns anos, mas agora com o advento da AWS e ofertas semelhantes que permitem escalar perfeitamente seu "poder do servidor", por que ainda existem servidores separados?
Minha linha de pensamento é assim (usando Star Wars: The Old Republic como exemplo): - Você está sempre em um planeta, uma "instância" isolada de outros planetas. - Se houver muitas pessoas em um planeta, SW: TOR cria uma nova instância do mundo e coloca jogadores lá. - Se você deixar o mundo / alternar instâncias, terá uma tela de carregamento
Então, por que o jogo não pode criar uma instância para este planeta. Esta instância (e somente esta) possui seus dados atuais em seu banco de dados e gerencia x players. Assim que x-50 jogadores estiverem nessa instância, um novo servidor será iniciado e novas pessoas aparecerão nessa instância. Os 50 pontos são reservados para mudar para o seu grupo, etc.
Poderia haver uma instância para as três principais regiões manterem a latência baixa, mas isso permitiria que você ainda tocasse com outros jogadores, por exemplo, SEA, se você puder viver com um atraso de 140ms (o que ainda não é nada).
Sempre que você alterna uma instância ou viaja para outro mundo, seu servidor atual fornece todos os seus dados para o próximo servidor, garantindo que você não precise de um grande banco de dados centralizado. Você ainda pode ter um que receba atualizações periodicamente para fins de análise.
Quando você efetua logoff ou os servidores perdem a conexão, os dados podem ser transferidos para um banco de dados maciço que é otimizado para armazenar os dados. Os servidores de instância podem ser otimizados para alta taxa de transferência.
Existe alguma razão específica para que isso não funcione? Existem outros problemas que estão faltando?
fonte
Respostas:
A AWS não é uma solução tão óbvia quanto parece. Pode ser caro, em alguns casos mais do que usar centros de dados internos (para um editor, o custo destes pode ser amortizado em vários produtos, por exemplo). Além disso, pode haver uma preocupação em armazenar binários e logs confidenciais no hardware fora do controle de alguém. Por fim, o poder computacional real nem sempre é o motivo para segregar a população de "servidores" nos MMOs.
Guild Wars 2, de fato, faz algo muito semelhante a isso. Os mapas são simulados por processos individuais do servidor, e as instâncias de estouro são criadas conforme necessário, com base no limite da população do mapa e em algumas heurísticas para o desempenho do mapa.
O Guild Wars 2 possui dois data centers importantes, um nos EUA e outro na Europa - há alguma conversa cruzada entre esses data centers (principalmente para os postos de comércio e sistemas de comércio), mas, em geral, eles existem nessa configuração para que os jogadores Alemanha, França etc. não precisam sofrer uma latência mais alta dos servidores de jogos dos EUA. Dentro do data center, os jogadores são classificados em "mundos domésticos" (ou "fragmentos" em termos vernaculares); mas uma das razões para isso é minimizar o número de players que um cliente pode ver e precisar reportar a ele. O aspecto do cliente desse problema não será resolvido expandindo para mais hardware de servidor. A explosão combinatória do servidor de caminhos de relatórios adicionais pode ser,
Você está perdendo algumas coisas, mas na maior parte são detalhes (e não explicarei como lidamos com eles de qualquer maneira, pois são considerados segredos comerciais) que não são relevantes para uma pergunta de nível geral tão geral. Penso que a maior falha na sua proposta é tentar entregar os dados do jogador para o novo servidor quando um jogador é transferido. Esse é um problema complexo que não pode ser dimensionado bem, provavelmente é melhor na prática ter esses dados do player em um sistema centralizado de servidores. É bastante possível se você não usar esses bancos de dados e o armazenamento de registros de tempo de execução primário para os dados.
fonte
Principalmente é sobre latência.
Em primeiro lugar, ter um servidor geograficamente próximo a você reduz a latência. Se o servidor estiver do outro lado do mundo, você verá mais latência do que se o servidor estiver a apenas alguns saltos de distância.
Em segundo lugar, serviços como o AWS não são projetados para trabalho em tempo real. Eles são projetados para alta taxa de transferência às custas de um pouco de latência. Se a sua página da web demorar 250ms a mais do que o normal para carregar em uma ocasião, ninguém se importa, mas se o seu jogo demorar 250ms a mais do que o normal para processar uma mensagem, a jogabilidade poderá ser seriamente afetada. É por isso que os MMOs são quase sempre hospedados em hardware dedicado.
Mas também é sobre design de jogos. Se você faz parecer que todos estão no mesmo mundo, mas precisam dividir uma zona quando ela fica cheia demais, as pessoas ficam frustradas por não encontrarem seus amigos nos pontos de encontro designados. Esse tipo de problema se estende às guildas, batalhas PvP em massa, etc. Os jogadores estão acostumados a instâncias hoje em dia, mas há certas áreas que se espera que sejam compartilhadas. Se você possui servidores completamente separados, pelo menos não há surpresas aqui.
Finalmente, existem outras questões tecnológicas a serem consideradas. Mesmo que cada instância seja bastante isolada das demais, geralmente ainda existem vários serviços que precisam se comunicar entre eles. A comunicação entre servidores é difícil de se dar bem em software em tempo real e levou a várias explorações e erros nos MMOs no passado. Em particular, entregar dados oficiais de jogadores de um para o outro é arriscado. Portanto, os desenvolvedores costumam errar por precaução e têm limites claramente delineados entre servidores, reduzindo a quantidade de tráfego que precisa atravessá-los.
fonte
na verdade, acredito que a resposta não está relacionada à rede ou à arquitetura, mas sim ao jogo, geralmente nesse tipo de jogo há eventos, e esses eventos são cronometrados de acordo com os prazos mais confortáveis para as pessoas que jogam no servidor, e isso geralmente é relacionados ao fuso horário em que as pessoas vivem, daí a UE e os EUA, etc.
Outro motivo é criar uma separação entre os mundos, para que, se houver um grupo forte demais, eles não atrapalhem o jogo de todos os que jogam, e você sempre pode mudar para um mundo menos "desafiador".
No lado da capacidade da CPU do servidor, embora as máquinas de hoje sejam bastante fortes, sempre há um limite para o que uma máquina pode manipular, e, portanto, é necessário criar uma separação entre mundos para proteger o jogo da sobrecarga e permitir que as pessoas escolham em qual mundo desejam jogar para que eles possam brincar com seus amigos. Escalonar horizontalmente não é apenas uma questão de ter máquinas, você precisa que seu aplicativo possa trabalhar em uma arquitetura escalonada horizontalmente, e isso não é tão fácil quando você tem milhares de "ações" acontecendo simultaneamente, com possível influência uma sobre a outra, e precisa sincronizar tudo. Eu acho que seria muito difícil fazer isso em várias máquinas.
fonte
O que há de errado com a instancia automática? Quando um local fica muito preenchido, basta colocar os 1000 jogadores em 10 instâncias diferentes.
O problema é que os jogos online são sobre a comunidade. Imagine que você marcou uma reunião com pessoas que conheceu antes e, quando estão todos lá no momento, não se veem porque estão em diferentes instâncias? Isso é chato e quebra a imersão.
Como isto pode ser evitado? Isso poderia ser feito colocando todos os jogadores na mesma instância o tempo todo, para que, quando você encontrar outro jogador uma vez, tenha certeza de encontrá-lo novamente quando ambos estiverem no mesmo local. Você nunca encontrará aqueles jogadores designados para outras instâncias.
Mas e quando você quiser conhecer alguém de fora do jogo? Como um amigo da vida real que você convidou para jogar o jogo com você? Para permitir que isso aconteça, você precisa escolher a instância ao criar seu personagem. Como em uma lista de instâncias com nomes fáceis de memorizar. Infelizmente, o nome "instância" parece confuso para o usuário médio. Eles não estão acostumados com essa palavra. Não seria melhor usar um termo a que estão acostumados? Um termo como ... Servidor ?
fonte