Há muito tempo, havia um jogo baseado na Web chamado Utopia (e tenho certeza que ainda existe), as curvas são por hora. Você só ganha ouro novo / madeira ou o que não é a cada hora.
Alguns jogos mais recentes baseados na Web têm recursos que aumentam em uma resolução mais fina, como por minuto. Digamos que um jogador tenha uma taxa de produção de alimentos de 5 por minuto - ele aumentará sua quantidade de alimentos a cada minuto. Não tenho certeza se é aconselhável definir constantemente um trabalho CRON para atualizar o banco de dados SQL, que suponho que eles estejam usando, pois é baseado na Web. Talvez eu esteja errado a cada minuto.
Quais técnicas esses jogos baseados na Web usam? Adicionado no Edit: E o banco de dados pode realmente lidar com a carga?
Os bancos de dados SQL modernos que são comumente usados (MySQL, Postgres, Oracle, MSSQL, etc.) permitem agendar procedimentos armazenados para serem executados com intervalos de tempo arbitrários. É um método muito leve de executar atualizações como essa e elimina a necessidade de chamar scripts ou programas externos para fazer isso por você.
Isso também permite que o banco de dados otimize a consulta executada apenas uma vez, em vez de fazê-lo toda vez que um script externo a invocar, por isso é muito útil do ponto de vista de desempenho. Obviamente, isso só se aplica se suas atualizações forem triviais o suficiente para serem programadas na linguagem de script do seu banco de dados. Atualizações de recursos, logout automático de intervalo de tempo, eliminação de registros e afins são excelentes candidatos para esses procedimentos armazenados agendados.
Provavelmente, o carregamento que seu banco de dados está ocorrendo vem 99,9% de carregamentos de páginas, atualizações de mecanismos de jogos e similares, pois um jogo popular pode facilmente ter centenas de milhares de consultas por segundo. Comparado à carga resultante da execução de algumas consultas (embora as que tocam grande parte da tabela) uma vez por minuto, aproximadamente, a carga não deve ser um problema. Ou seja, a menos que você atualize os valores indexados pelo banco de dados. Evite atualizar as colunas indexadas a todo custo, se você se preocupar com o desempenho.
fonte
Em relação às atualizações:
Alguns usam trabalhos CRON que atingem uma determinada página PHP de vez em quando.
Alguns usam trabalhos CRON, desta vez executando um determinado processo.
Outra abordagem é fazer atualizações 'just in time' - sempre que uma página for carregada, execute as atualizações pendentes e execute-as nesse ponto. Isso geralmente é o que você deve fazer se não conseguir executar tarefas CRON ou processos de longa execução.
Finalmente, outros estão executando o aplicativo Web inteiro como um processo, para que possam atualizar sempre que virem a hora.
O sistema final é o melhor se você tiver essa opção disponível, pois poderá armazenar os dados na memória. Atualizar alguns milhares de jogadores uma vez por minuto é trivial se você estiver apenas alterando dados na RAM, em vez de precisar gravar em um banco de dados SQL tradicional.
Mas se você não tiver esse luxo, poderá usar algum tipo de cache. Algo como memcached pode ser uma opção (dependente da sua hospedagem), que é um ponto intermediário entre a memória e um banco de dados. Você pode armazenar valores transitórios no memcache e salvá-los apenas no banco de dados quando for absolutamente necessário.
Entre o memcache e um banco de dados SQL tradicional, existem outras opções, por exemplo. as várias lojas de chave / valor ou de documentos: coisas como MongoDB , CouchDB , Amazon ou Google, etc ... ou seja. todos os sistemas sob o termo guarda-chuva NoSQL . Normalmente, eles não oferecem o poder de consulta genérico nem sempre as mesmas garantias de segurança de um banco de dados tradicional, mas geralmente são muito mais rápidos em operação. (O que não é tão surpreendente, pois eles estão fazendo menos por você.)
Mas tudo isso assumindo que um banco de dados normal não pode lidar com a carga. De fato, na maioria dos casos, provavelmente pode. Se eu tiver que emitir 10.000 chamadas UPDATE por minuto para aumentar os níveis de recursos, isso não será muito escalável quando você começar a adicionar todo o resto. Mas se você alterar isso para atualizar o recurso para todos com 1 chamada SQL, de repente as coisas parecerão muito mais positivas. Portanto, não superestime o custo de um determinado recurso, pois ele pode ser implementado de forma mais eficiente.
fonte
Sou a favor do KISS : "Seja simples, estúpido!"
Não vejo razão para que um trabalho cron não funcione, e a vantagem é que as opções baratas de hospedagem na web geralmente não permitem executar comandos diretamente, mas permitem executar comandos cron. Portanto, não há necessidade de um servidor dedicado caro.
Você também pode fazer seu código de atualização no PHP ou no idioma de sua preferência, usando o comando cron ou use o navegador de texto. As instruções em Configurando Tarefas Cron têm vários comandos de exemplo que você pode usar para executar ping em sua própria página em um intervalo.
wget --spider http://yoursite.com/secretphppage.php
lynx
fonte
Lembro-me de dar uma olhada no código de algum clone do Planetarion. Tudo é PHP, mas o código do ticker está em C bruto - com ligações C do MySQL. Como o modelo de dados era muito simples, as atualizações acontecem muito rapidamente.
fonte