Já falei aqui de outros serviços do Azure, está na hora de falar de Queues, ou filas.

Filas são algo necessário por casusa da natureza do processamento distribuído, que sofre com a latência, e não teria escalabilidade se fosse fortemente consistente. Mais informações em um post que escrevi a alguns meses sobre ACID X Base, que são conceitos opostos para tratamento de atualizações. Entenda o seguinte se não quiser ler porque BASE é quase obrigatório em aplicações na nuvem: precisamos de filas.

E no Azure elas fazem parte do próprio SO, não são serviços adicionais, como o Workflow, ou o SDS.

Uma fila enfilera mensagens. As mensagens no Azure são strings, mas imagino que futuramente isso deve poder conter algum tipo de dado binário. As mensagens geralmente contém informações do tipo "atualize a tabela x com o valor y", ou "conte o total e atualize a coluna tal", ou ainda "mande um e-mail se o processamento x já terminou e ainda não teve o e-mail enviado". Uma fila pode ter mensagens de até 8KB, mas um número infinito de mensagens.

Queues funciona assim: Imagina que você tem dois fornecedores de fila, e eles enfileram 4 mensagens. Assim:

Início da fila

Temos também, como visto acima, dois consumidores de fila, C1 e C2, que vão buscar mensagens na fila. No caso acima, o C1 puxou uma mensagem da fila, a mensagem 1, por 30 segundos. Nestes 30 segundos a mensagem 1 está invisível na fila para todo mundo, mas ainda não foi excluída da fila.

Então o consumidor 2 puxa a mensagem 2 para ele, também por 30 segundos. O C1 ainda processa a mensagem 1. Assim:

Mensagens processadas

Aí o C2 termina de consumir a mensagem 2, e exclui ela da fila. Agora, mesmo o C2 quebrar, a mensagem 2 já foi processada e morreu. Assim:

Um consumidor terminou

Então o C1 cai por causa de algum bug ou outro problema. Ele ainda não tinha terminado de processar a mensagem 1. Então os 30 segundos passam, e a mensagem volta a aparecer na fila automaticamente. Assim:

Um consumidor caiu

Então o C2 vai puxar uma nova mensagem da fila, e puxa a primeira na ordem, que é a mensagem 1, que vai agora ser processada pelo C2. Assim:

Final do processamento

Dessa forma, a mensagem 1 tem garantia de processamento ao menos uma vez. O problema está nesse "ao menos". Isso significa que ela pode ser processada mais que uma vez? Significa. Quantas vezes? Impossível dizer. Programe-se para que ela possa rodar n vezes, sem deixar o sistema inconsistente. Como? Verificando se ela já rodou, ou algo do tipo. A mensagem pode ser ACID internamente, mesmo se for BASE para o serviço, não se esqueça disso.

Esse processo todo dá garantia de processamento se uma parte do sistema cair.

Ah, quem são os consumidores da fila? Geralmente vão ser worker roles do próprio Azure. Obrigatoriamente? Não, obvio que não. Poderia ser um serviço web? Poderia, mas acho que vai ser um cenário mais incomum.

No próximo eu continuo com exemplos de código, mas concretos.


Postado na(s) categoria(s) Azure pelo giovanni bassi em 25 de março de 2009 às 02:08 | Tags:

Comentar


(Vai mostrar seu Gravatar)

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading



Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

Eu vou ao TechEd Brasil 2010, e você?

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  julho 2010  »
seteququsedo
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in