View a markdown version of this page

GAMEREL03-BP02 Implemente um acoplamento flexível de recursos do jogo para lidar com falhas com impacto mínimo na experiência do jogador - Lentes da indústria de jogos

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

GAMEREL03-BP02 Implemente um acoplamento flexível de recursos do jogo para lidar com falhas com impacto mínimo na experiência do jogador

Os componentes de desacoplamento se referem ao conceito de projetar componentes de servidor para que eles possam operar da forma mais independente possível. Alguns aspectos do jogo são difíceis de separar, pois os dados precisam estar o mais atualizados possível para proporcionar uma boa experiência de jogo aos jogadores. No entanto, muitos componentes e tarefas de jogos podem ser dissociados. Por exemplo, tabelas de classificação e serviços de estatísticas não são essenciais para a experiência de jogo, e as leituras e gravações nesses serviços podem ser realizadas de forma assíncrona a partir do jogo.

Nível de risco exposto se esta prática recomendada não for estabelecida: Alto

Orientação para implementação

Implemente uma degradação normal dos recursos do seu jogo que podem ser desativados automaticamente ou por um administrador se forem detectados problemas, bem como configure serviços upstream que dependam do recurso para lidar com a falha normalmente. Por exemplo, se dados específicos do jogador não estiverem sendo carregados corretamente em seu cliente de jogo, você deve considerar se esses dados são essenciais para a experiência de jogo. Caso contrário, configure o cliente do jogo para lidar com essa falha sem interromper a experiência do jogador, optando por tentar buscar esses dados novamente mais tarde, quando o jogador revisitar a tela.

Use lógica como tempos limite, novas tentativas e recuo para lidar com erros e falhas. Os tempos limite evitam que os sistemas fiquem suspensos por períodos excessivamente longos. As novas tentativas podem fornecer alta disponibilidade de erros transitórios e aleatórios.

Defina componentes não críticos que podem ser acoplados frouxamente aos componentes críticos. O acoplamento frouxo permite que os sistemas sejam mais resilientes, pois a falha em um componente não ocorre em cascata em outros. Quando os recursos do jogo não exigem conexões com estado com seus servidores de jogos ou back-end, você deve implementar protocolos sem estado para escalar dinamicamente e se recuperar de falhas transitórias. Desenvolva seus componentes não críticos onde eles possam ser livremente acoplados a protocolos sem estado usando uma API. HTTP/JSON Implemente chamadas de rede do cliente do jogo de forma assíncrona e sem bloqueio para minimizar o impacto sobre os jogadores de recursos de jogo de baixo desempenho ou outros serviços dependentes.

Para melhorar ainda mais a resiliência por meio do acoplamento flexível, use um serviço de mensagens, como enfileiramento, streaming ou um sistema baseado em tópicos entre componentes que possam ser manipulados de forma assíncrona. Esse modelo é adequado para uma interação que não exige uma resposta imediata ou em que uma confirmação de que uma solicitação foi registrada é suficiente. Essa solução envolve um componente que gera eventos e outro que os consome. Os dois componentes não se integrarão por meio de interação direta ponto a ponto, mas por meio de um intermediário, como uma camada durável de armazenamento ou filas. Isso também ajuda a melhorar a confiabilidade do sistema preservando as mensagens quando o processamento falha.

Pesquise e selecione um mecanismo de mensagens apropriado, pois vários serviços de mensagens têm características diferentes, como mecanismos de pedido e entrega. Projete operações para serem idempotentes para que o sistema de mensagens escolhido entregue mensagens pelo menos uma vez. Como exemplo, considere um caso de uso típico de um jogo em que seu jogo precisa monitorar o tempo de jogo, as estatísticas ou outros dados relevantes do jogador, o que pode levar a um caso de uso de alto rendimento de gravação em momentos de pico de simultaneidade de jogadores.

Para implementar uma arquitetura confiável, considere se o caso de uso exige consistência de leitura após gravação, conforme percebida pelo player. Normalmente, cenários como esses são adequados para processamento assíncrono e podem ser obtidos com a implementação de um padrão de filas de gravação em que as solicitações são ingeridas em uma fila de mensagens escalável e durável, como o Amazon SQS, e podem ser inseridas em seu banco de dados de back-end em lotes usando um serviço ao consumidor, como uma função Lambda. Essa abordagem é mais confiável do que a comunicação síncrona entre vários componentes distribuídos, incluindo o cliente de jogo do jogador, seus servidores web e de aplicativos de back-end e seu sistema de banco de dados interno. Também reduz os custos porque o banco de dados de back-end não precisa ser escalado para atender ao pico de taxa de transferência de gravação, pois o processamento do consumidor na fila de gravação pode ser usado para diminuir essa taxa de ingestão conforme necessário.

Etapas de implementação

  • Separe componentes não críticos, como tabelas de classificação e serviços de estatísticas, dos recursos essenciais de jogabilidade para permitir operações assíncronas e aprimorar a resiliência.

  • Implemente uma degradação gradual de recursos não essenciais com lógica para tempos limite, novas tentativas e recuo, e verifique se o cliente do jogo lida com falhas sem interromper a experiência do jogador.

  • Use sistemas de mensagens como o Amazon SQS para comunicação assíncrona entre componentes, permitindo o processamento escalável, durável e confiável de casos de uso de alto rendimento.

Recursos