Obrigado por visitar a The Game Makers Brasil Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais. |
Como funcionam os servidores de MMO's?
- GabrielXavier
- Membro
- Reações: 0
- Mensagens: 39
- Localização: Goiás
-
- Contato:
Como funcionam os servidores de MMO's?
Boa noite, há um certo tempo tenho um projeto em mente de um MMO, venho tirando duvidas e estudando para um dia começar a desenvolver já pelo caminho certo, mas ainda me restam muitas duvidas de como funciona um jogo online com milhares de jogadores online ao mesmo tempo.
Sei bem como funciona uma arquitetura cliente-servidor, sei como funcionam as trocas de dados entre os mesmos, entendo bastante de banco de dados e sei usar o networking do Game Maker Studio. Meu servidor será desenvolvido em Java e vou usar bancos de dados Mysql, vou contratar servidores VPS para serem os servidores do meu jogo.
Digamos que tenho um game online com 10mil jogadores, e cada servidor suporta 1mil jogadores então eu devo ter 10 ou 11 servidores para atender a demanda, até ai tudo bem.
Mas minha principal duvida é, como é feita a distribuição desses servidores? (estou completamente perdido nesse sentido, vou tentar explicar minha duvida).
Cada jogador é associado a um servidor especifico ao se cadastrar no jogo e toda vez que ele entrar no jogo ele se conecta a apenas aquele servidor?
Ou cada vez que o jogador se conecta no jogo ele é redirecionado para um servidor aleatório? Caso seja dessa forma tem que ter um servidor principal que se comunica com todos os outros servidores, onde todo jogador ao fazer loguin passa por esse servidor principal e é redirecionado para outro servidor que tenha vagas?
Sobre a base de dados, o banco de dados deve ficar em um servidor separado onde todos os outros servidores podem acessa-lo e fazer requisições de dados? Se não for dessa forma, então como funciona o controle de base de dados nos servidores dos jogos MMO?
Estou meio perdido até com relação a como descrever minhas duvidas, pesquisei bastante sobre o assunto mas não encontrei nada que pudesse responde-las.
Eu agradeço muito a quem puder dar dicas ou mandar links para estudos! Obrigado!
Sei bem como funciona uma arquitetura cliente-servidor, sei como funcionam as trocas de dados entre os mesmos, entendo bastante de banco de dados e sei usar o networking do Game Maker Studio. Meu servidor será desenvolvido em Java e vou usar bancos de dados Mysql, vou contratar servidores VPS para serem os servidores do meu jogo.
Digamos que tenho um game online com 10mil jogadores, e cada servidor suporta 1mil jogadores então eu devo ter 10 ou 11 servidores para atender a demanda, até ai tudo bem.
Mas minha principal duvida é, como é feita a distribuição desses servidores? (estou completamente perdido nesse sentido, vou tentar explicar minha duvida).
Cada jogador é associado a um servidor especifico ao se cadastrar no jogo e toda vez que ele entrar no jogo ele se conecta a apenas aquele servidor?
Ou cada vez que o jogador se conecta no jogo ele é redirecionado para um servidor aleatório? Caso seja dessa forma tem que ter um servidor principal que se comunica com todos os outros servidores, onde todo jogador ao fazer loguin passa por esse servidor principal e é redirecionado para outro servidor que tenha vagas?
Sobre a base de dados, o banco de dados deve ficar em um servidor separado onde todos os outros servidores podem acessa-lo e fazer requisições de dados? Se não for dessa forma, então como funciona o controle de base de dados nos servidores dos jogos MMO?
Estou meio perdido até com relação a como descrever minhas duvidas, pesquisei bastante sobre o assunto mas não encontrei nada que pudesse responde-las.
Eu agradeço muito a quem puder dar dicas ou mandar links para estudos! Obrigado!
[ ] Publicar um App no Google Play.
[ ]GANHAR DINHEIRO.
[ ]Viver com o lucro dos meu jogos/apps (Sonho).
[ ]GANHAR DINHEIRO.
[ ]Viver com o lucro dos meu jogos/apps (Sonho).
Re: Como funcionam os servidores de MMO's?
tenho experiência com servidores de lineage então o que vou descrever se refere ao mesmo, não sei se vale para outros jogos.
loginserver = base de dados que cuida dos dados do login
gameserver = base de dados que cuida dos dados referente ao jogo
então para vários servidores vc vai ter um servidor principal que é o login server onde vai ser validado os dados de usuário e senha, após isso será redirecionado para um lobby onde será listado todos os servidores disponíveis. (a questão de entrar aleatório pode ser feita uma programação em ramdom onde verifica o que tem menor usuário e joga o player pra lá).
como você entende de java da uma olhada na biblioteca do l2j que você vai entender o que estou falando.
to saindo pro trabalho agora assim que chegar lá dou uma complementada no post.
loginserver = base de dados que cuida dos dados do login
gameserver = base de dados que cuida dos dados referente ao jogo
então para vários servidores vc vai ter um servidor principal que é o login server onde vai ser validado os dados de usuário e senha, após isso será redirecionado para um lobby onde será listado todos os servidores disponíveis. (a questão de entrar aleatório pode ser feita uma programação em ramdom onde verifica o que tem menor usuário e joga o player pra lá).
como você entende de java da uma olhada na biblioteca do l2j que você vai entender o que estou falando.
to saindo pro trabalho agora assim que chegar lá dou uma complementada no post.
- Superbomber
- Programador
- Reações: 0
- Mensagens: 283
- Localização: Natal-RN
-
Re: Como funcionam os servidores de MMO's?
1) Bem você pode fazer a divisão entre os servidores de duas maneiras simples.
A primeira já foi citada pelo demonwar.
1.1) Você tem o servidor onde tem as informações das contas de usuários. Lá fica login, senha, conquistas, medalhas, pontuações etc.
Se você criar um site para o jogo(o que é praticamente obrigatório que seja feito), você pode usar o mesmo servidor do site para tal fim.
E tem os servidores exclusivamente dedicados para a game-play. Onde estes servidores seriam os que você programou em Java.
Manter uma estrutura como essa custa alto, mas com o lucro inicial do jogo dá para investir se realmente necessitar de uma infra como esta.
Não recomendo que a escolha de servidor seja aleatória. Se o jogador não puder escolher o servidor terá que contar com a sorte caso queira jogar com um amigo.
Você pode fazer com que uma opção de servidor seja escolhida de acordo com a taxa de uso. (o servidor com menos jogadores aparece como opção selecionada para o player)
Ai se o jogador quiser, ele pode mudar de servidor antes de iniciar o jogo. (se o jogador não combinou com um amigo, a tendência é ele entrar no server com menos jogadores)
1.2) Como antes o servidor do site do jogo é o principal para login do jogador. Mas dessa vez as informações sobre as estatísticas de game dele ficam separadas para cada servidor.
Como se cada servidor que ele entra, fosse uma conta diferente.
Assim o jogador caso queira começar do zero, pode simplesmente mudar de servidor.
Nessa forma de organização, os jogadores ficam com suas contas "presas" ao servidor que ele jogou antes.
Isto é, se ele quiser continuar de onde parou vai jogar novamente no mesmo servidor no dia seguinte. O mesmo vale para todos os jogadores que resolveram jogar naquele servidor. (assim não mais dividindo de acordo com a demanda de jogadores)
A organização ocorre porque os jogadores mais novos tendem a criar conta nos servidores mais novos. Mas periodicamente você teria que lançar um server novo para dar conta da massa de jogadores.
2) Você pode inicialmente contratar um VPS para dar o primeiro passo no seu game.
A expansão da infro você fará com o próprio lucro que o jogo lhe proporcionou.
Se houver necessidade de expandir antes de ter lucro razoável, a estrutura pode ficar instável antes que você tenha dinheiro para expandir. Então pense na forma que você vai arrecadar dinheiro com o jogo, ela precisa ser realmente eficaz. (não dá pra ficar na tentativa e erro, tem que ser eficaz logo de começo)
3) O banco de dados não deve ficar nos servidores de jogo. Eles devem ser exclusivo para manter o jogo no ar. (requisições a DB vai dar latência)
O DB no caso, seria no servidor principal.
Você pode fazer que ao jogador entrar no servidor o mesmo carregue os dados no DB e armazene na memória. (salvo na sessão do jogador)
Então quando o jogador sair, ele atualiza as informações no DB.
Dessa forma existe o risco de que se por algum motivo o servidor travar, perca a gameplay do jogador naquela sessão.
Então é recomendável que salve de forma periódica também. (algo como de dois em dois minutos)
4 - *Bônus)
4.1) Tome cuidado com DoS, é um risco bem sério. Principalmente porque você não tem muita experiência com isso, então irei logo dar dicas:
Limite o tamanho de QUALQUER dado enviado para o servidor.
Com qualquer, quero dizer qualquer dado mesmo. Dê um número limite de caracteres para o nome de usuário, senha, nick, limite o tamanho do avatar. (não apenas em dimensão mas também em MB. Você não quer o usuário upando uma foto de 4GB no teu server, quer?)
Qualquer dado que o jogador possa definir, tem que haver um limite. (um limite que não faça o servidor apresentar a mensagem: #CRASH: Heap Overflow)
Tem outras coisas que você pode fazer para evitar DoS, mas eu achei esta a mais importante para citar aqui.
4.2) Tente dar segurança as contas dos jogadores.
- Faça políticas para punir os jogadores que tentarem "roubar" os outros jogadores.
- Evite ataque de força-bruta/dicionário. Errou a senha três vezes? Fica de molho cinco minutos.
- Deixe explícito aos jogadores que vocês nunca pedem senha ou fazem perguntas pessoais. Deixe claro também que se houver invasão na conta deles, vocês não se responsabilizam. (é sempre bom evitar uns processos)
- Se você precisar pedir número de cartão de crédito ou algo assim (para fazer compras de algum item no jogo ou sei lá), NÃO armazene estes dados. Nem mesmo se for criptografado.
Se invadirem a conta do usuário e obterem esses dados (convenhamos, os jogadores são negligentes com suas contas), provavelmente vão culpar vocês. (mesmo vocês não tendo responsabilidade legal já que deixou explícito isso no contrato, ainda sim é uma trágica perda. -1 gamer)
Agora se invadirem o servidor do jogo, ai vocês podem ser responsabilizados legalmente. O que implica em um processo para cada jogador que foi afetado pela invasão.
4.3) "Eu li e aceito os termos do contrato" - The best lie of the year.
É no contrato que ninguém lê antes de aceitar, que você vai salvar sua pele e a da sua empresa.
É nele que você deixa explícito que você é incento de qualquer responsabilidade caso a conta do jogador seja invadida, caso alguma venda de item no game tenha acabado mal, caso algum jogador "roube" você de alguma forma, etc.
É ali que você é mercenário e diz: "Não sou responsável, se fud*o. Quem mandou não ler?"
Flw.
A primeira já foi citada pelo demonwar.
1.1) Você tem o servidor onde tem as informações das contas de usuários. Lá fica login, senha, conquistas, medalhas, pontuações etc.
Se você criar um site para o jogo(o que é praticamente obrigatório que seja feito), você pode usar o mesmo servidor do site para tal fim.
E tem os servidores exclusivamente dedicados para a game-play. Onde estes servidores seriam os que você programou em Java.
Manter uma estrutura como essa custa alto, mas com o lucro inicial do jogo dá para investir se realmente necessitar de uma infra como esta.
Não recomendo que a escolha de servidor seja aleatória. Se o jogador não puder escolher o servidor terá que contar com a sorte caso queira jogar com um amigo.
Você pode fazer com que uma opção de servidor seja escolhida de acordo com a taxa de uso. (o servidor com menos jogadores aparece como opção selecionada para o player)
Ai se o jogador quiser, ele pode mudar de servidor antes de iniciar o jogo. (se o jogador não combinou com um amigo, a tendência é ele entrar no server com menos jogadores)
1.2) Como antes o servidor do site do jogo é o principal para login do jogador. Mas dessa vez as informações sobre as estatísticas de game dele ficam separadas para cada servidor.
Como se cada servidor que ele entra, fosse uma conta diferente.
Assim o jogador caso queira começar do zero, pode simplesmente mudar de servidor.
Nessa forma de organização, os jogadores ficam com suas contas "presas" ao servidor que ele jogou antes.
Isto é, se ele quiser continuar de onde parou vai jogar novamente no mesmo servidor no dia seguinte. O mesmo vale para todos os jogadores que resolveram jogar naquele servidor. (assim não mais dividindo de acordo com a demanda de jogadores)
A organização ocorre porque os jogadores mais novos tendem a criar conta nos servidores mais novos. Mas periodicamente você teria que lançar um server novo para dar conta da massa de jogadores.
2) Você pode inicialmente contratar um VPS para dar o primeiro passo no seu game.
A expansão da infro você fará com o próprio lucro que o jogo lhe proporcionou.
Se houver necessidade de expandir antes de ter lucro razoável, a estrutura pode ficar instável antes que você tenha dinheiro para expandir. Então pense na forma que você vai arrecadar dinheiro com o jogo, ela precisa ser realmente eficaz. (não dá pra ficar na tentativa e erro, tem que ser eficaz logo de começo)
3) O banco de dados não deve ficar nos servidores de jogo. Eles devem ser exclusivo para manter o jogo no ar. (requisições a DB vai dar latência)
O DB no caso, seria no servidor principal.
Você pode fazer que ao jogador entrar no servidor o mesmo carregue os dados no DB e armazene na memória. (salvo na sessão do jogador)
Então quando o jogador sair, ele atualiza as informações no DB.
Dessa forma existe o risco de que se por algum motivo o servidor travar, perca a gameplay do jogador naquela sessão.
Então é recomendável que salve de forma periódica também. (algo como de dois em dois minutos)
4 - *Bônus)
4.1) Tome cuidado com DoS, é um risco bem sério. Principalmente porque você não tem muita experiência com isso, então irei logo dar dicas:
Limite o tamanho de QUALQUER dado enviado para o servidor.
Com qualquer, quero dizer qualquer dado mesmo. Dê um número limite de caracteres para o nome de usuário, senha, nick, limite o tamanho do avatar. (não apenas em dimensão mas também em MB. Você não quer o usuário upando uma foto de 4GB no teu server, quer?)
Qualquer dado que o jogador possa definir, tem que haver um limite. (um limite que não faça o servidor apresentar a mensagem: #CRASH: Heap Overflow)
Tem outras coisas que você pode fazer para evitar DoS, mas eu achei esta a mais importante para citar aqui.
4.2) Tente dar segurança as contas dos jogadores.
- Faça políticas para punir os jogadores que tentarem "roubar" os outros jogadores.
- Evite ataque de força-bruta/dicionário. Errou a senha três vezes? Fica de molho cinco minutos.
- Deixe explícito aos jogadores que vocês nunca pedem senha ou fazem perguntas pessoais. Deixe claro também que se houver invasão na conta deles, vocês não se responsabilizam. (é sempre bom evitar uns processos)
- Se você precisar pedir número de cartão de crédito ou algo assim (para fazer compras de algum item no jogo ou sei lá), NÃO armazene estes dados. Nem mesmo se for criptografado.
Se invadirem a conta do usuário e obterem esses dados (convenhamos, os jogadores são negligentes com suas contas), provavelmente vão culpar vocês. (mesmo vocês não tendo responsabilidade legal já que deixou explícito isso no contrato, ainda sim é uma trágica perda. -1 gamer)
Agora se invadirem o servidor do jogo, ai vocês podem ser responsabilizados legalmente. O que implica em um processo para cada jogador que foi afetado pela invasão.
4.3) "Eu li e aceito os termos do contrato" - The best lie of the year.
É no contrato que ninguém lê antes de aceitar, que você vai salvar sua pele e a da sua empresa.
É nele que você deixa explícito que você é incento de qualquer responsabilidade caso a conta do jogador seja invadida, caso alguma venda de item no game tenha acabado mal, caso algum jogador "roube" você de alguma forma, etc.
É ali que você é mercenário e diz: "Não sou responsável, se fud*o. Quem mandou não ler?"
Flw.
Entrem neste link com o JavaScript desabilitado e vejam a mágica: https://tgmbrasil.com.br/?PageSpeed=n0script
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes