Usando Amazon SQS como sistema de mensagens (1/2)

Nos últimos anos tem sido cada vez mais comum o uso da chamada arquitetura de microsserviços, em especial quando se fala de sistemas para a Internet, em que se espera um volume grande de acessos, mesmo que em horários específicos. A adoção desta arquitetura permite que o software seja construído a partir de componentes menores e com próposito específico, fazendo com que cada módulo possa ser escalado de forma independente e conforme a necessidade de negócio. Um caso típico é um site de e-commerce, em que os sistemas responsáveis pelo catálogo de produtos e pelo fechamento da compra precisam ter uma resposta mais rápido do que o sistemas que fazem a cobrança, emitem nota fiscal e liberam o pacote para a entrega.

E neste cenário de sistemas distribuídos, como fica a comunicação entre os componentes?

Uma solução bastante tradicional neste sentido consiste no uso de um middleware de gerenciamento de mensagens. O middleware atua como um ponto centralizador, onde cada sistema envia ou recebe mensagens de filas específicas. No mundo Java EE, temos a especificação JMS que trata justamente deste assunto, e que os diversos application servers precisam implementar para dar suporte este tipo de serviço. Como cada application server tem características próprias e alguns casos custo elevado, nem sempre a adoção desta ferramenta será viável, dado o timing ou o orçamento do projeto.

Fora do mundo Java EE, temos outras ferramentas, e uma bastante interessante é o Amazon SQS (Simple Queue Service). Como o próprio nome diz, o SQS é um sistema bem simples, porém bastante eficiente, para gerenciamento de filas, oferecido no modelo de Software as a Service dentro da suíte AWS, com custo bastante competitivo – chega ser gratuito até um certo volume mensal.

A seguir iremos mostrar como configurar uma fila SQS, e em um próximo post iremos escrever uma aplicação Java enviar e receber mensagens desta fila.

Para nosso exemplo, vamos supor uma funcionalidade do tipo “esqueci minha senha” em um portal. Quando o usuário clicar no link solicitando uma nova senha, o sistema do frontend irá postar uma mensagem em uma fila. Em paralelo, outro sistema ficará monitorando esta fila e enviando os emails solicitados.

Configurando uma fila SQS

Para utilizar o SQS, você deve criar uma conta no Amazon AWS, caso você ainda não tenha. Criada a conta, faça login e você verá o console da AWS, onde poderá selecionar o serviço desejado:

Figura 1 – Console de entrada da AWS

 

Selecione a opção SQS e você será levado ao console de administração de filas:

Figura 2 – Console de entrada do SQS

Veja que ainda não temos nenhuma fila criada. Selecione “Create New Queue” para criar sua primeira fila. Será mostrada a seguinte tela de configuração:

Figura 3 – Configuração de fila SQS

Nesta você irá definir os poucos, mas importante, parâmetros de cada fila, descritos a seguir:

  • Region: é a região da AWS onde sua fila será criada. A região com que você está trabalhando é definida no console principal da AWS, no canto superior direito;
  • Queue Name: é o nome da fila propriamente dita, e que será referenciado no código. Vamos utilizar no nosso exemplo “reset-password-queue”;
  • Default Visibility Timeout: este parâmetro está diretamente ligado ao modus operandi do SQS. Quando solicitamos as mensagens de uma fila através de um comando do tipo “ReceiveMessages”, as mensagens não são removidas da fila. Elas apenas ficam invisíveis para que não sejam reprocessadas por uma segunda instância da mesma aplicacão consumidora. Quando a aplicação que recebeu a mensagem fizer o processamento com sucesso, ela deva enviar uma requisição do tipo “DeleteMessage”, para que aí sim ela seja removida. Este tempo configurado é o timeout para que se receba o comando de “Delete”. Passado este tempo, o SQS assume que houve algum erro no processamento da mensagem e a deixa novamente disponível. Para o caso de envio de emails, podemos considerar que 30 segundos é um tempo adequado para o timeout.
  • Message Retention Period: é o tempo máximo que uma mensagem ficará disponível no SQS;
  • Maximum Message Size: este é o tamanho máximo da mensagem a ser postada na fila.
  • Delivery Daley: este é o tempo mínimo que o SQS irá esperar antes de tornar uma mensagem recém-postada na fila visível.
  • Receive Message Wait Time: este tempo está ligado à otimização de código do cliente do SQS. Quando a fila estiver vazia, e receber uma requisição de “Receive” o SQS irá esperar o tempo configurado pelo recebimento de uma mensagem antes de retornar uma lista vazia.
  • Use Redrive Policy/Dead Letter Queue/Maximu Receives: estes três parâmetros estão relacionados ao tratamento de erros fatais. Quando habilitados, o SQS irá considerar que a mensagem possui um erro fatal quando atingir N tentativas de processamento sem o comando de Delete correspondente. E irá movê-la para a Dead Letter Queue, possivelmente para tratamento manual.

Agora que conhecemos e configuramos todos os parâmetros, basta criar nossa fila. O resultado é mostrado abaixo:

Figura 4 – Fila SQS criada

Nesta tela temos a coluna “Messages Available”, que mostra quantas mensagens estão disponíveis na nossa fila, e “Messages In Flight”, que são as mensagens já recebidas por um consumidor, mas ainda não removidas. Estão aguardando o comando de Delete ou o Visibility Timeout. Já no fim da tela temos os detalhes da fila, incluindo a URL. Esta URL será utilizada em nosso código para envio e recepção de mensagens.

Antes de partir para o código, devemos configurar as permissões na nossa fila, para que só usuários devidamente autorizados possam executar ações sobre a mesma. Para isso, clique com o botão direito na fila e selecione Add a Permission.

Figura 5 – Menu de opções da fila

Será então mostrada a tela:

Figura 6 – Configuração de permissões

Nesta configuração você deve dar as permissões explícitas para que cada conta da AWS execute as ações necessárias sobre a fila. Para efeito de demonstração, iremos conceder todas as permissões a Everybody. Em um ambiente de produção, claro, as permissões deverão ser mais refinadas.

Bom, finalizamos esta introdução ao SQS por aqui. No próximo post iremos abordar o uso do Amazon Java SDK para o envio de recepção de mensagens do SQS.

Links externos

Por LUIS SERGIO F. CARNEIRO

Postado em: 19 de outubro de 2015

Confira outros artigos do nosso blog

Estimando Custos na AWS

08 de março de 2016

Anderson Lima

Usando Amazon SQS como sistema de mensagens (2/2)

02 de março de 2016

Luis Sergio F. Carneiro

Cine Dojo: a mistura da MATERA de Coding Dojo, Cinema, Pipoca e TI!

04 de fevereiro de 2016

Valmir Massafera Jr

Documentação da sua Nuvem com Linha do Comando

15 de dezembro de 2015

Matias Schweizer

Deixe seu comentário