Utilizando o Microsoft Azure Cache em aplicações ASP.NET

Olá pessoal,

Algumas pessoas me perguntam como melhorar o desempenho de uma aplicação rodando no Microsoft Azure. Existem várias possibilidades de otimização, uma delas é o uso de cache, fazendo com que a aplicação diminua a latência no acesso aos dados e consequentemente tenha um melhor tempo de resposta ao usuário.

O primeiro passo no uso do cache é a criação de uma instância do serviço de cache (no momento que este post foi escrito o serviço estava em preview). Para isso, selecione o botão New, em seguida Data Services, Cache, Quick Create e forneça o endpoint que o cache será acessado, a região que o serviço ficará localizado e o seu tamanho, que pode variar entre 128MB até 150GB.

image

Depois do cache criado, o processo de criação pode levar alguns minutos para ser concluído, o próximo passo é utilizar o cache. Em um projeto ASP.NET no Visual Studio, vc pode adicionar referências aos componentes de cache via NuGet, pesquisando por Windows Azure Cache.

image

Além de instalar todas as referências, o NuGet também faz algumas modificações no arquivo web.config, facilitando bastante o uso do cache. Vc deve informar o endpoint do serviço de cache, no formato <Nome>.cache.windows.net, substituindo o conteúdo [Cache role name or Service Endpoint] do elemento autoDiscover. Vc encontra o endereço do endpoint no dashboard do serviço de cache:

image

O próximo passo é fornecer a chave de acesso para autenticação do cache. Para isso, descomente a sessão secutiryProperties do web.config e forneça a chave de acesso, substituindo o texto [Authentication Key] . A chave de acesso pode ser encontrada através da opção Manage Keys do portal de gerenciamento:

image

Finalmente, o próximo passo é utilizar o cache no código da sua aplicação. O primeiro passo é criar um objeto da classe DataCache, disponível no namespace Microsoft.ApplicationServer.Caching. Se o construtor padrão for utilizado uma conexão com o cache padrão será criada.

O cache possui vários métodos para interagir com o seu conteúdo, mas um padrão bastante comum utilizado é o Cache-Aside, onde ser verifica se o conteúdo já existe no cache, se não existir deve-se buscar o conteúdo no repositório de dados, em seguida adicionar o conteúdo no cache e depois retornar, conforme diagrama abaixo:

image

Criei um projeto padrão ASP.NET MVC no Visual Studio 2013 e modifiquei o método About do controller HomeController para utilizar o cache. No método GetAboutMessageFromRepository, faço um Thread.Sleep de 10 segundos para simular a demora de uma consulta complexa em um banco de dados:

public ActionResult About()
{
ViewBag.Message = GetAboutMessage();

        return View();
}

private static string GetAboutMessage()
{
const string AboutMessage = "AboutMessage";
DataCache cache = new DataCache();

    object aboutMessage = cache.Get(AboutMessage);

    if (aboutMessage == null)
{
aboutMessage = GetAboutMessageFromRepository();
cache.Add(AboutMessage, aboutMessage);
}

return aboutMessage.ToString();
}

private static string GetAboutMessageFromRepository()
{
Thread.Sleep(10000);
return "Your application description page.";
}

Nos próximos posts pretendo detalhar um pouco a classe DataCache, com seus principais métodos, como controlar a expiração de conteúdo e também como utilizar o cache integrado com o ASP.NET para controlar sessão e o output cache das páginas.

Abs.,

RG