Esta pergunta é sobre melhores práticas em arquitetura.
Nossa Arquitetura Atual
Eu tenho uma classe PHP que acessa o MySQL para informações do usuário. Vamos chamá-lo User
. User
é acessado muitas vezes, por isso implementamos camadas de cache para reduzir a carga.
A primeira camada é o que chamamos de cache "por solicitação". Depois que os dados foram recuperados do MySQL, armazenamos os dados em uma propriedade privada de User
. Quaisquer pedidos subsequentes para os dados retornam a propriedade em vez de solicitar novamente os dados do MySQL.
Como a solicitação da Web vive e morre conforme a solicitação, esse cache apenas impede que o aplicativo acesse o MySQL mais de uma vez em uma única solicitação.
Nossa segunda camada é o Memcached. Quando a propriedade privada está vazia, primeiro verificamos os dados no Memcached. Se o Memcached estiver vazio, consultamos os dados do MySQL, atualizamos o Memcached e atualizamos a propriedade privada de User
.
A questão
Nossa aplicação é um jogo e, às vezes, é imperativo que alguns dados estejam o mais atualizados possível. No período de aproximadamente cinco minutos, uma solicitação de leitura para os dados do usuário pode ocorrer 10 ou 11 vezes; uma atualização pode ocorrer. Os pedidos de leitura subsequentes precisam estar atualizados ou a mecânica do jogo falha.
Então, o que fizemos foi implementar um pedaço de código que é executado quando ocorre uma atualização do banco de dados. Esse código define a chave no Memcached com os dados atualizados, para que todas as solicitações subsequentes ao Memcached estejam atualizadas.
Isso é ótimo? Há alguma preocupação com o desempenho ou outras "dicas" que devemos estar atentos ao tentar manter uma espécie de "cache ativo" como esse?