Aumentar capacidade de processamento sem aumentar memória ou adicionar servidores? Processamento assíncrono!

Quando desenvolvemos uma solução de software, queremos que ela tenha desempenho, seja escalável, tenha disponibilidade, e que principalmente que ela consiga garantir qualidade na experiência que o usuário vai ter usando o produto em questão.

Aí alguns já parquem para a parte técnica, querendo usar resquehornetQamazon sqs,msmq, entre outros. Mas antes precisamos entender contexto, e saber qual é a solução que melhor pode nos atender neste contexto. Uma simples simulação de fila de jobs em banco de dados pode ser uma solução útil e funcional. O ponto é que quando começamos a falar de mensageria, e processamento assíncrono, não é apenas o processamento de filas que aparece.

Temos uma série de operações que podemos realizar com filas, sejam em processos de transformação, tradução, redirecionamento, quebrando grandes mensagens em pequenos batches de processamento, enfim. Entram os Enterprise Architecture Patterns. Que são importantíssimos quando estamos pensando em requisitos não funcionais de aplicações.

Quero abrir o assunto mensageria neste post, e falar de algumas soluções que estamos colocando em teste dentro do time. O processamento de jobs e novos testes de escalabilidade. Queremos ganhar em desempenho, mas sem nos preocupar com infra estrutura. Apesar de podermos ser elásticos ou ganhar em escala horizontal com novos nós de processamento, queremos poder continuar com a mesma infra estrutura e otimizar recursos computacionais.Note o uso correto da palavra recurso. 🙂

Então nós próximos posts, eu vou tratar de dois tópicos:

  • Processamento de Jobs e formas de tratar isto em um aplicativo web. Neste caso vou brincar com o Quartz. A galera da Caelum já fez um post bem legal sobre o assunto.
  • Amazon SQS, que é o serviço de filas da Amazon. Também vou falar de soluções mais tradicionais para isto, exemplo HornetQ da JBoss.

Para entender um pouquinho do quanto é difícil 🙂 usar o SQS, depois de fazer download doClient Java da Amazon, eu tive que fazer o seguinte para testar:

  1. criar uma instância do AmazonSQSClient.
  2. criar uma fila. Depois de criar uma fila, recebemos de volta uma URL para poder acessar a fila em questão. Duas linhas de código são necessárias para isto.
  3. enviar uma mensagem, usando um comando sendMessage, passando por parâmetro a URL da fila em questão, e o texto. Passe o que você quiser, mas normalmente enviamos um documento XML ou JSON para servir de idioma da fila. Cada fila possui uma expectativa de conteúdo, e cada aplicativo cliente sabe o que esperar dentro da fila.
  4. receber a mensagem, e neste caso importante garantir a questão de escala. Podemos fazer uma requisição indicando o número máximo de mensagens que queremos recuperar da fila em questão. Exemplo, no máximo 10. Imaginando que você tem muito trabalho para fazer em várias filas diferentes, esta abordagem permite que possamos realizar um pouco de processamento, mas sem ficar “trancado”.
  5. excluir a mensagem da fila depois de processar. Toda mensagem possui um ID e é através dele que podemos requisitar que a mensagem seja removida da fila. Funciona como um “ack”.
  6. depois de “limpar” a fila, consumindo todas mensagens, no meu exemplo eu removo a própria fila, criada no passo 2. Para isto tem um comando deleteQueue, onde passo a URL da fila que desejo remover.

Então é por aí. Em 6 passos, e algumas linhas de código podemos fazer um exemplo bem legal brincando com o SQS. Lembrando que sempre que você trabalhar com Amazon Web Services, remova o que você criar para não ser tarifado.

Quem escreveu este post? Daniel Wildt é CTO da Trevisan Tecnologia e curte ajudar o time a melhorar continuamente. Site no danielwildt.com e twitter @dwildt.

Publicidade