Fernando Correia

Inserção assíncrona em tabelas do Azure

In Dicas on 8 dez 2012 at 10:56

Utilidade do padrão assíncrono

Tradicionalmente os aplicativos que aprendemos a desenvolver executam operações de forma síncrona. Ou seja, o programa aguarda que a operação comandada termine antes de prosseguir. É um estilo de programação mais simples, porém ele não aproveita da melhor forma os recursos do computador.

Especialmente em caso de servidores web e/ou serviços, que sejam utilizados de forma concorrente para atender a múltiplas requisições, bloquear o programa enquanto aguarda a execução de uma operação diminui a quantidade de requisições que podem ser atendidas simultaneamente.

Para alcançar maior escalabilidade e, em última instância, economizar dinheiro em recursos de computação, é mais vantajoso empregar o padrão assíncrono, em que o programa comanda o início de uma operação e prossegue para outras independentes, indicando o código que deverá ser executado quando a operação que foi iniciada terminar.

Por causa da latência envolvida em aplicações distribuídas, especialmente em plataformas na nuvem como o Windows Azure, é recomendável usar chamadas assíncronas. Essa recomendação é ainda mais importante ao se trabalhar com dispositivos como telefones e tablets, ou qualquer dispositivo que tenha pouca bateria e conexão à internet fraca ou intermitente.

Exemplo de inserção assíncrona no Table Service

O SDK do Azure para .NET e  a linguagem C# facilitam bastante a utilização do padrão assíncrono de programação.

Este método, por exemplo, insere uma entidade em uma tabela do Table Storage Service do Azure de forma assíncrona:

A chamada a BeginSaveChangesWithRetries inicia a operação de salvamento da entidade no Table Service. O primeiro parâmetro é uma “callback”, ou seja, uma função que será executada quando a operação terminar. Esta função chama o método EndSaveChangesWithRetries para concluir a operação de salvamento e liberar qualquer recurso que tenha sido utilizado. O código-fonte destes métodos está no projeto do SDK do Azure para .NET, no GitHub.

Métodos Begin e End são um par

Quando eu estava criando uma classe que usava este recurso, meu código estava gerando um erro obscuro:

The current object did not originate the async result. Parameter name: asyncResult

No final e graças ao suporte da Microsoft através do Stack Overflow, eu percebi que eu tinha usado o método EndSaveChanges na callback em vez de EndSaveChangesWithRetries. O método End deve ser o par do método Begin que foi usado, caso contrário o objeto de resultado que ele receberá será incompatível.

Exemplo

Este é um exemplo completo de como inserir entidades no Table Service de forma assíncrona:

O tratamento de exceções não está demonstrado porque irá variar conforme a arquitetura de cada aplicação.

Para executar este código, crie um projeto Cloud com um Worker Role e defina uma configuração StorageConnectionString nos Settings do projeto: