Postagem de convidado: Tom Rosenfeld, líder de equipe, Come2Play
A Come2Play é uma empresa que oferece jogos multijogador on-line na Web. Nosso site atende a mais de 4 milhões de jogadores por mês, com dezenas de milhares de jogadores a qualquer momento. Usamos o MySQL como banco de dados e o IIS em nossos servidores da Web, que executam ASP.Net e asp clássico (código legado).
Como um aplicativo da Web de grande escala, descobrimos que precisávamos ser capazes de escalonar. Uma das maneiras mais sensatas e comuns de ajudar no dimensionamento na arquitetura da Web atual é usar uma camada de cache, e o software mais usado para isso é, obviamente, o Memcached.
Quando procurei uma biblioteca Memcached para ASP.Net, encontrei o Enyim Memcached Client, que me levou ao Membase (então chamado NorthScale). Depois de experimentar um pouco com a versão "regular" do Memcached e compará-la com o Membase, várias vantagens imediatas ficaram bem claras:
- Separação de caçambas
- Configuração muito simples
- Facilidade de instalação
- Um console de gerenciamento de interface do usuário da Web muito polido e intuitivo
- Uma maneira segura de usar o Memcached e o Membase na mesma implementação
Com relação à configuração:
Em vez de ter que gerenciar uma lista de todos os nossos servidores Memcached em um arquivo de configuração, eu apenas defini um único ponto de entrada para um servidor Membase. Instalei o Membase em nossos servidores IIS e deixei que o localhost fosse o ponto de entrada, evitando assim a temida falha de ponto único e mantendo nossos arquivos de configuração sucintos.
Optamos por assimilar o uso do Memcached e do Membase de forma muito gradual, a fim de evitar riscos e impedir o estrangulamento do desenvolvimento de novos recursos (um ponto de vista muito ágil).
Definimos o escopo de três fases principais para o nosso projeto:
- Fase 1: Cache de consultas pesadas em um bucket Memcached dedicado
- Fase 2: Armazenar em cache os dados específicos do usuário em um bucket Memcached específico do usuário
- Fase 3: Salvar dados específicos do usuário em um bucket do Membase
Fase 1: Consultas pesadas
O desafio preliminar aqui foi criar uma biblioteca adequada tanto para .Net quanto para COM. Depois de lidarmos com nossa biblioteca, o resto foi fácil. O efeito em nossos servidores MySQL foi muito positivo e perceptível: uma redução significativa nas tabelas temporárias significou mais memória livre para os índices e uma melhoria significativa no desempenho geral do site, sem mencionar a redução esperada nas consultas/segundo.
Com a implementação básica do Memcached em vigor, consegui implementar a primeira fase rapidamente usando a consulta com seus parâmetros anexados como chaves no Memcached e escrevendo um método chamado "GetDataTableCached", que obtém dados do cache ou do banco de dados em caso de falha e os armazena em cache. Em seguida, ao executar todas as chamadas para "GetDataTable", consegui localizar e substituir todas as chamadas que não eram específicas do usuário por "GetDataTableCached".
Defino um tempo limite de 15 minutos para essas chaves para que os dados no cache não se tornem muito obsoletos. Portanto, se alguém alterar uma configuração do sistema por meio do nosso sistema CMS, ela entrará em vigor em, no máximo, 15 minutos. A vantagem dessa abordagem é óbvia: não há necessidade de escrever código para invalidar ou atualizar essas chaves.
Observe também que o armazenamento em cache do resultado de um método poderia ser ainda mais simples com o uso de AOP (por exemplo, PostSharp). Optei por evitar isso devido ao aumento do tempo de compilação.
Fase 2: Dados específicos do usuário
Essa mudança é muito gradual, pois estamos movendo dados que são:
- Em caso de uso muito intenso, verificamos os registros do MySQL para encontrá-los
- Fácil de mover - dados que estão sendo alterados em vários locais do código
(por exemplo, a moeda virtual do usuário) é muito mais difícil de mover do que dados que nunca
alterações (por exemplo, a data de registro do usuário)
Fase 3: dados específicos do usuário com persistência em disco
Essa etapa foi muito fácil após as fases anteriores graças a uma solução muito simples e elegante (e, a propósito, o que considero o principal ponto forte do Membase): ele usa exatamente o mesmo protocolo "on the wire" usado pelo Memcached. Isso é útil para duas coisas:
- Mover dados relevantes do MySQL para o Membase
- Use o Membase para novos recursos, ignorando completamente o MySQL
Em resumo, o Membase está permitindo que a Come2Play se expanda facilmente. Adoramos o Membase porque ele é simples de usar, elegante e sofisticado.