Indisponibilidade de Diablo II: Resurrected: Uma explicação, como estamos trabalhando nisso e o que faremos no futuro.
Olá, pessoal.
Desde o lançamento de Diablo II: Resurrected, temos enfrentado vários problemas de servidor e gostaríamos de oferecer uma explicação clara sobre o que está causando esses problemas e quais medidas tomamos até agora para resolvê-los. Também queremos contar um pouco sobre o que faremos no futuro.
Resumo: As quedas dos servidores não tiveram uma única causa. Estamos resolvendo cada problema conforme eles aparecem, com medidas paliativas e alterações de longo prazo na arquitetura. Um pequeno número de jogadores teve perda de progresso de personagem. A partir de agora, qualquer perda causada por queda de servidor deverá limitar-se a alguns minutos. Esta não é uma solução definitiva, e continuaremos trabalhando para resolver esse problema. Nossa equipe, com a ajuda de outros profissionais da Blizzard, está trabalhando para que a experiência de jogo seja ótima para todos.
Falaremos de alguns detalhes mais específicos de engenharia, mas esperamos que, de modo geral, isso ajude a compreender por que essas quedas têm ocorrido, o que estamos fazendo para resolver cada caso e como estamos investigando a causa-raiz geral. Vamos começar pelo princípio.
Os problemas com os servidores:
Antes de falarmos sobre os problemas, vamos explicar brevemente como funcionam nossos bancos de dados dos servidores. Primeiro, temos o banco de dados global, que funciona como a única fonte de verdade de todas as informações de personagem e progresso. Como podem imaginar, é uma tarefa grande demais para um único banco de dados. Para aliviar a carga e a latência do banco de dados global, cada região (AN, UE e Ásia) tem seu próprio banco de dados, que também armazena as informações de personagem e progresso, e o banco de dados da região grava periodicamente no global. A maioria das suas ações no jogo é realizada usando esse banco de dados regional, que é mais rápido, e o personagem fica “vinculado” a ele para manter a integridade do registro individual. O banco de dados global também tem um backup em caso de falha do principal.
Com isso em mente, para explicar o que está acontecendo, focaremos nos períodos de indisponibilidade que ocorreram de 9 de outubro (sábado) até agora.
Na manhã de sábado (no horário do Pacífico), tivemos uma queda global devido a um aumento súbito e significativo do tráfego. Foi um novo patamar que nossos servidores não tinham atingido, nem no lançamento. Isso foi agravado por uma atualização que lançamos no dia anterior com a intenção de melhorar o desempenho na criação de jogo. Esses dois fatores combinados sobrecarregaram nosso banco de dados global, fazendo-o atingir o tempo-limite. Decidimos reverter a atualização de sexta-feira para tentar reduzir a carga dos servidores para domingo e poder investigar melhor a causa-raiz.
Porém, no domingo, ficou claro que o que fizemos no sábado não foi suficiente. Tivemos um aumento ainda maior do tráfego, causando uma nova queda. Nossos servidores de jogo detectavam a desconexão do banco de dados e tentavam reconectar imediatamente, várias vezes, fazendo com que o banco de dados nunca tivesse tempo de lidar com o trabalho que havíamos concluído porque estava muito ocupado lidando com um fluxo contínuo de tentativas de conexão dos servidores de jogo. Durante esse período, também percebemos que podíamos fazer melhorias de configuração no registro de eventos do banco de dados, o que é necessário para restaurar a integridade em caso de falha, então fizemos esses ajustes e prosseguimos com a análise da causa-raiz.
A queda dos servidores no domingo teve dois lados. Por causa do que enfrentamos no sábado, tínhamos uma espécie de manual de como se recuperar rapidamente. O que foi bom.
Porém, como voltamos a ficar online tão rápido em um período de pico de atividade de jogadores, com centenas de milhares de jogos em dezenas de minutos, tivemos outra queda. O que foi ruim.
Por isso, tivemos que fazer muitas correções, incluindo melhorias de configuração e de código, que foram implementadas no backup do banco de dados global. Assim, chegamos a 11 de outubro, segunda-feira, quando fizemos a troca entre os bancos de dados globais. Isso levou a outra queda quando o backup do banco de dados continuou, erroneamente, a executar o processo de backup. Ou seja, ele passou a maior parte do tempo tentando copiar do outro banco de dados quando deveria estar atendendo a solicitações dos servidores. Enquanto isso, descobrimos mais problemas e fizemos mais melhorias. Encontramos uma consulta obsoleta exigente que poderia ser completamente eliminada do banco de dados, otimizamos as verificações de elegibilidade dos jogadores ao entrar em um jogo, reduzindo ainda mais a carga, e também fizemos mais melhorias de desempenho que estão sendo testadas neste momento. Também acreditamos que corrigimos os excessos de reconexão ao banco de dados, pois não tivemos esse problema na terça-feira.
Na terça, atingimos outro pico de jogadores simultâneos, com algumas centenas de milhares em uma única região. Isso causou outra redução no desempenho do banco de dados, cuja causa está sendo analisada por nossos engenheiros de banco de dados. Também chamamos outros engenheiros da Blizzard para trabalhar em correções menores enquanto nossa equipe se concentrava nos problemas principais dos servidores, além de pedir ajuda aos nossos parceiros.
Por que isso está acontecendo:
Para manter a essência do jogo, mantivemos muito do código original. Porém, há um serviço legado em particular que está tendo dificuldades para acompanhar o comportamento dos jogadores modernos.
Esse serviço, com alguns aprimoramentos em relação ao original, lida com partes críticas da funcionalidade do jogo, como criação e entrada em jogos, atualização/leitura/filtragem de listas de jogos, verificação da integridade do servidor de jogo e leitura de personagens a partir do banco de dados para garantir que o personagem pode participar do que você está buscando. É importante mencionar que esse serviço é um singleton, isto é, só podemos executar uma instância dele para garantir que todos os jogadores vejam sempre a versão mais atualizada e correta da lista de jogos. Otimizamos esse serviço de várias formas para adequá-lo às tecnologias mais modernas, mas, como mencionamos, muitos dos nossos problemas têm origem na criação de jogo.
Mencionamos o “comportamento dos jogadores modernos” porque é uma questão interessante. Em 2001, não havia tanto conteúdo na Internet sobre como jogar Diablo II “corretamente” (incursões contra Baal por EXP, Pelefermo/Esgoto Ancestral/etc. por itens mágicos etc.). Atualmente, no entanto, novos jogadores podem encontrar muitos criadores de conteúdo incríveis que ensinam como jogar de diversas formas, e muitos delas incluem bastante carga do banco de dados ao criar, carregar e destruir vários jogos rapidamente. Embora tenhamos previsto isso — jogadores criando novos personagens em novos servidores, esforçando-se para obter itens mágicos —, subestimamos muito o volume em nossas deduções a partir dos testes beta.
Além disso, em geral, estávamos salvando com muita frequência no banco de dados global. Não é necessário fazer isso tantas vezes. Na verdade, deveríamos salvar no banco de dados regional e salvar no banco de dados global somente ao desvincular. Essa é uma das medidas paliativas que implementamos. Estamos escrevendo código para alterar completamente como fazemos isso, para que não salvemos no banco de dados global quase nunca, o que reduzirá significativamente a carga do servidor, mas é uma reformulação da arquitetura que levará algum tempo para desenvolver, testar e implementar.
Uma observação sobre perda de progresso:
A perda de progresso que alguns jogadores tiveram é devido à forma como vinculamos os personagens nos bancos de dados regionais e global: vinculamos o personagem no banco de dados global quando uma região é atribuída a você (por exemplo, ao jogar na região dos EUA, o personagem é vinculado à região dos EUA, e a maioria das ações é resolvida no banco de dados da região dos EUA).
O problema foi que, durante uma queda do servidor, quando o banco de dados estava em colapso, alguns personagens estavam ficando presos no banco de dados regional, e não tínhamos como movê-los para o banco de dados global. Naquele momento, pensamos que tínhamos duas opções: ou desvinculamos todos com alterações não salvas no banco de dados global, causando alguma perda de progresso devido à substituição que ocorreria no banco de dados global, ou derrubamos o jogo completamente por um período indeterminado e executamos um script para gravar os dados regionais no banco de dados global.
Escolhemos então a primeira opção. Pensamos que era mais importante manter o jogo disponível do que derrubá-lo por um longo período para restaurar os dados. Pedimos desculpas aos jogadores que perderam progresso importante ou itens valiosos. Também somos jogadores e sabemos como uma reversão é decepcionante.
No futuro, acreditamos que temos uma forma de restaurar personagens sem causar perda de dados significativa. A perda deve limitar-se a alguns minutos, se houver, em caso de queda do servidor.
Isso é um avanço, mas ainda não é bom o suficiente em nossa opinião.
O que estamos fazendo a respeito:
Limitação de fluxo: Estamos limitando o número de operações no banco de dados para criação e entrada em jogos e sabemos que isso está afetando muitos de vocês. Por exemplo, quem está fazendo incursões contra Pelefermo entra e sai de um jogo e cria outro em 20 segundos. Nesse caso, haverá limitação de fluxo em um momento. Quando isso ocorrer, a mensagem de erro dirá que há um problema de comunicação com os servidores de jogo. Isso não significa que os servidores estão indisponíveis, só indica que houve limitação de fluxo para reduzir temporariamente a carga do banco de dados, com o objetivo de manter o jogo funcionando. Isso é somente uma medida paliativa e temporária. Não consideramos que seja uma solução de longo prazo.
Criação da fila de conexão: Tivemos uma série de problemas no último final de semana, não o mesmo problema repetidamente. Por causa da renovação da base de jogadores, da inclusão de várias plataformas e de outros problemas associados ao dimensionamento, podemos continuar encontrando pequenos problemas. Para diagnosticá-los e resolvê-los com rapidez, precisamos impedir a “aglomeração” — ou seja, muitos jogadores conectando-se simultaneamente. Para isso, estamos trabalhando em uma fila de conexão, parecida com o que temos em World of Warcraft. Isso manterá o número de jogadores no nível seguro atual para podermos monitorar quando o sistema está com dificuldades e resolver antes que o jogo fique totalmente indisponível. Sempre que corrigirmos uma sobrecarga, poderemos aumentar os limites de jogadores. A fila de conexão já foi implementada parcialmente no back-end (no momento, parece uma falha de autenticação no cliente) e deve ser implantada totalmente nos próximos dias para PC, sendo adicionada para consoles posteriormente.
Separação de partes críticas da funcionalidade em serviços menores: Este trabalho está parcialmente em andamento para o que pode ser feito em menos de um dia (algumas partes já foram concluídas esta semana) e em planejamento para projetos maiores, como novos microsserviços (por exemplo, um serviço de lista de jogos que só é responsável por fornecer a lista aos jogadores). Depois de separar a funcionalidade crítica, poderemos ampliar nossos serviços de gerenciamento de jogo, o que reduzirá a carga.
Temos profissionais trabalhando muito para gerenciar os incidentes em tempo real, diagnosticar problemas e implementar correções, não somente da equipe de D2R, mas de toda a Blizzard. Este jogo significa muito para todos nós. Muitos de nós na equipe jogamos D2 a vida toda, desde o lançamento inicial em 2001, alguns fazem parte da comunidade de mods etc. Podemos garantir que seguiremos trabalhando até que a experiência de jogo seja ótima para nós não somente como desenvolvedores, mas também como jogadores e membros da comunidade.
Continue enviando seu feedback pelo fórum de Diablo II: Resurrected e relate os bugs pelo nosso fórum de relatos de bugs. Para obter assistência com solução de problemas, acesse nosso fórum de suporte técnico. Obrigado pela comunicação contínua conosco em todos os canais. Ela é inestimável para nós enquanto trabalhamos nesses problemas.
A equipe da comunidade de Diablo compartilhará atualizações sobre nosso progresso nos fóruns.
Equipe de Desenvolvimento de Diablo II: Resurrected