Estou tendo um problema engraçado, mas também terrível. Estou prestes a lançar um novo aplicativo (iPhone). É um jogo multiplayer baseado em turnos, rodando em meu próprio back-end personalizado. Mas tenho medo de lançar.
Por alguma razão, acho que pode se tornar algo grande e que sua popularidade matará meu pobre servidor solitário e banco de dados MySQL.
Por um lado, estou pensando que, se estiver crescendo, é melhor eu estar preparado e ter uma infraestrutura escalável já em funcionamento.
Por outro lado, sinto vontade de divulgá-lo ao mundo e ver o que acontece.
Costumo ler coisas como "otimização prematura é a raiz de todo mal" ou pessoas dizendo que você deve apenas criar seu jogo assassino agora, com as ferramentas disponíveis, e me preocupar com outras coisas, como escalabilidade posteriormente.
Eu adoraria ouvir algumas opiniões sobre isso de especialistas ou pessoas com experiência nisso. Obrigado!
Respostas:
Na verdade, é uma escolha bastante fácil.
No momento, você tem zero usuários e a escalabilidade não é um problema.
Idealmente, você deseja atingir o ponto em que possui milhões de usuários e a escalabilidade se torna um problema.
No momento, você não tem um problema de escalabilidade; você tem um problema de número de usuários. Se você trabalhar no problema de escalabilidade, não solucionará o problema do número de usuários, o que significa que você terá resolvido um problema que ainda não possui e não terá resolvido o problema que possui. O resultado mais provável é que seu produto não funcione e todo o seu trabalho será por nada.
Se você trabalhar no problema número-de-usuários, você vai resolver um problema que você tem agora e , em seguida, você pode se concentrar na próxima problema, que pode ser escalabilidade.
O bom dos problemas de escalabilidade é que, por definição, tê-los geralmente significa que os negócios são muito bons e, por sua vez, isso significa que você pode gastar dinheiro na otimização da escalabilidade. Você não passa de zero usuário para dez milhões da noite para o dia e, se ficar de olho no desempenho do sistema, terá tempo de sobra para otimizar quando chegar a hora.
É claro que ajuda a manter a escalabilidade em mente ao escrever o código que você precisa no momento, mas não faz muito sentido gastar dezenas ou mesmo centenas de horas-homem em um recurso do qual você não sabe se será necessário, e o cenário mais provável é que você não precise. No momento, sua principal preocupação é enviar. O que acontece depois disso; bem, você pode se preocupar com isso mais tarde.
fonte
Não há motivo para otimizar até que você saiba que a otimização é necessária. Como você sabe que a otimização é necessária? Você mede.
Supondo que seu servidor tenha algum tipo de interface baseada na Web, você pode simular muitos usuários usando ferramentas como o Apache JMeter . Aprenda a usar a ferramenta e comece a testar o seu back-end. Você deve aprender o suficiente para saber quais são os limites para o seu sistema. Em seguida, você pode combinar essas informações com o número de usuários que você possui e o número médio em execução ao mesmo tempo, para decidir quando aumentar a escala.
fonte
TL; DR Você deve pensar em escalabilidade antes de escrever a primeira linha de código.
Primeiras coisas primeiro. Scalabilty! = Otimização
Você deve pensar em escalabilidade antes de escrever a primeira linha de código. Isso não significa que você construa uma infraestrutura maciça com a chance de seu jogo ser um sucesso. Pensar em escalabilidade significa:
MAS parece que você já tem uma base de código. A questão agora é quando começar a dimensionar. Isso depende completamente do seu código.
Se o seu código se presta ao dimensionamento , você tem a parte mais difícil. Você pode obter uma conta da AWS, ativar servidores conforme necessário e ir embora.
Se o seu código não for dimensionado ou tiver gargalos , você precisará trabalhar. Você precisa identificar quais são seus gargalos e corrigi-los. O "quando" é realmente difícil de saber. Alguns platôs de serviços, outros aumentam constantemente e outros explodem. Decidir quando jogar recursos em algo como escalar geralmente é uma função dos negócios e é uma avaliação dos riscos.
Na sua posição , posso lançar como "beta" e gerenciar as expectativas do usuário. Dessa forma, posso retirar o produto e ver como ele se desenrola.
fonte
Portanto, há duas vezes em que você deve pensar em escalabilidade.
Primeiro, ele deve ser cuidadosamente ponderado antes de você escrever uma única linha de código. Isso é para garantir que você não se escreva em um buraco de escalabilidade e para garantir que seu código esteja instrumentado para fornecer as medidas necessárias pela segunda vez.
A segunda vez em que se considera a escalabilidade é suficiente para que as coisas se tornem inaceitavelmente lentas. Isso significa que você precisa saber o que significa "muito lento" e como sua coisa reage sob carga. Se você tiver um serviço cujo driver (provavelmente qps) aumente em N% ao mês, terá tempos bastante diferentes de "95% dos recursos da máquina consumidos" se o uso de recursos for quadrado da carga ou linear.
Com um jogo baseado em turnos, você deve ter uma margem de segurança decente (provavelmente não está tendo um único mundo de jogo e, se o fizer, provavelmente existe uma geometria interna, o que significa que você não tem "todo mundo interage com todo mundo"). transformar "problemas).
Sem saber detalhes, levaria um ou dois dias para pensar sobre onde você tem problemas de dimensionamento e quais estratégias possíveis você tem para resolvê-los. Mas, isso é importante, pense. Não faça, apenas pense (e documente). A menos que você tenha problemas de escalabilidade que começam a se manifestar em algumas centenas de usuários, você deve ter tempo para verificar a carga e aumentar mais recursos de back-end.
fonte
Na sua descrição, parece que existem dois resultados possíveis:
Hummm.
Aqui estão algumas perguntas para se perguntar:
A resposta à sua pergunta deve ficar evidente quando você as considerar. Nenhum especialista pode dizer o que fazer sem mais informações, pois todos os sistemas são diferentes e todos os negócios são diferentes.
fonte
Seu servidor será usado interativamente pelos usuários. Isso significa que a latência está afetando a experiência do usuário de uma maneira muito profunda. Uma latência ruim sempre resulta em uma experiência ruim do usuário.
Pelo menos faça alguns testes de carga ad-hoc, conforme descrito por Bryan.
Uma abordagem mais séria
Faça algumas simulações e descubra o que a latência faz com a sua experiência do usuário (usando uma simulação de atraso de rede ou apenas dormir () dentro do seu aplicativo). Descubra em que latência está ficando perceptível, irritante e inutilizável.
Em seguida, vem o primeiro passo na direção da otimização. Escolha um SLA para o servidor: por exemplo, na pior das hipóteses, 10% de chamadas com latência irritante e 1% de chamadas com latência inutilizável. Com esses limites, você pode usar o teste de carga para descobrir quantos usuários seu servidor pode suportar.
O teste de taxa de transferência pura sem medir a latência (ou pelo menos manualmente usando o servidor durante o teste de carga) não é tão útil porque não informa se os números de taxa de transferência medidos resultam em uma experiência suportável do usuário.
Uma apresentação muito agradável sobre a medição da latência por Gil Tene: http://www.infoq.com/presentations/latency-pitfalls
fonte
No estágio de requisitos de negócios, que é usado para estabelecer um entendimento comum de desempenho para todos os elementos a jusante, como arquitetura, operações, desenvolvimento, controle de qualidade e monitoramento no prod. Se você não estabelecer um entendimento comum sobre o que é necessário desde o início, cada uma das partes da organização fará suposições sobre o desempenho (ou nem sequer pensará nelas) ao se envolver em tarefas específicas ao longo do ciclo de vida da organização. inscrição. Isso é verdade se você está envolvido em cascata, cascata curta, ágil ou qualquer que seja a metodologia de desenvolvimento do momento na lista de palavras-chave do currículo.
Desempenho e escalabilidade são difíceis. Funcionalidade é fácil. O código de escala insuficiente aumentará para preencher qualquer pool de recursos que você fornecer, portanto, mudar a bolha de custos comprando hardware maior leva apenas muito antes de você precisar corrigir o código ineficiente ou adquirir cada vez mais hardware. Deixar isso durar em prioridade também é muito caro. Existem decisões de arquitetura e design que são tomadas no início do ciclo de vida do aplicativo que podem precisar ser completamente revertidas para atender a um requisito de chegada tardia relacionado ao desempenho - pense em um fabricante de carros esportivos de alto desempenho que precise mudar do alumínio para o alumínio fibra de carbono no final do ciclo de design para atingir uma relação potência / peso relacionada ao desempenho e como isso afeta as ferramentas, o treinamento, a construção do carro, etc.
Pergunte aos arquitetos, desenvolvedores e pessoas da operação da sua organização quais são os requisitos de desempenho para o aplicativo. Se elas não forem capturadas da empresa, não se surpreenda se você receber respostas diferentes (ou nenhuma resposta) de pessoas diferentes, mesmo dentro do mesmo grupo. Essas "suposições" sempre voltam para atacar a organização na implantação.
fonte