Mensageria com Amazon SQS

Natanael Pantoja
Natanael Pantoja

Compartilhe

São muitos os sistemas de mensageria disponíveis. Ou Message Oriented Middleware, MOM, se preferir.

Alguns exemplos que temos de MOM são: IBM MQSeries, RabbitMQ, HornetQ, ActiveMQ. Alguns servidores de aplicação tem internamente um MOM configurado, como o JBoss, que usa o hornetQ.

A amazon tem um MOM disponibilizado como serviço, dispensando a configuração e manutenção da infraestrutura, o SQS (Simple Queue Service).

Banner promocional da Imersão Cloud DevOps da Alura e Google Cloud com o texto "INSCRIÇÕES ABERTAS PARA A PRIMEIRA EDIÇÃO DA IMERSÃO CLOUD DEVOPS" e a informação de 3 aulas gratuitas com certificado. A imagem mostra um desenvolvedor focado usando fones de ouvido em um computador, com uma colega trabalhando ao fundo, e um botão chamativo com a frase "GARANTA A SUA VAGA".

Como funciona o SQS? Muito simples. Os desenvolvedores podem criar número ilimitado de filas e número ilimitado de mensagens e só vai ser cobrado pelo que for transferido para fora, porque os dados transferidos entre o SQS e uma máquina no EC2 dentro de uma mesma região são gratuitos.

Vamos usar o SDK da amazon para entender o funcionamento do SQS. Primeiro temos que configurar uma fila, como mostra a figura a seguir:

Nova Fila

A parametrização é tranquila, basta você dar um nome para a fila e definir algumas variáveis, como o período de visibilidade da mensagem e período de retenção da mensagem.

Então vamos ao código. Para publicar uma mensagem basta você instanciar o cliente e enviar a mensagem desejada. Lembrando que as credenciais que voçê tem que passar são as credenciais criadas na amazon para que uma aplicação a acesse de fora.

 String url = "https://sqs.us-east-1.amazonaws.com/403828569551/caelum-queue-jms"; AmazonSQSClient sqsClient = new AmazonSQSClient(awsCredentials); sqsClient.sendMessage(new SendMessageRequest() .withQueueUrl(url).withMessageBody("Texto da MSG.")); 

Você pode visualizar a mensagem publicada utilizando o plugin da amazon pro eclipse. Veja a imagem a seguir:

Mensagem Enviada

Para receber a mensagem publicada basta criar um objeto do tipo ReceiveMessageRequest que aponta para a nossa fila na amazon instanciar nosso cliente e usar o método receiveMessage.

 ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest("https://sqs.us-east-1.amazonaws.com/403828569551/caelum-queue-jms"); AmazonSQSClient sqsClient = new AmazonSQSClient(awsCredentials); List<Message> messages = sqsClient.receiveMessage(receiveMessageRequest).getMessages(); for (Message message : messages) { System.out.println("MSG"); System.out.println("MsgID: " + message.getMessageId()); System.out.println("Identificador Único MSG: " + message.getReceiptHandle()); System.out.println("MD5 do Corpo da MSG: " + message.getMD5OfBody()); System.out.println("Corpo: " + message.getBody()); for (Entry<String, String> entry : message.getAttributes().entrySet()) { System.out.println("Atributos"); System.out.println("Nome: " + entry.getKey()); System.out.println("Valor: " + entry.getValue()); } } 

Para cada mensagem enviada o SQS gera um ID único para e um hash para você garantir que a mensagem não foi alterada e para poder ler a mensagem quantas vezes for necessário. Outro ponto interessante é que o SQS não faz FIFO (Fist in Fist out), ou seja, diferente dos outros sistemas de mensageria ele não remove automaticamente a mensagem já lida. Ela permanece lá até o tempo de validade dela expirar ou você executar a remoção de forma programática. Mas enquanto a mensagem está sendo lida ela fica bloqueada para que outros consumidores não leiam a mensagem igual. Se você precisa de FIFO, você tem que projetar sua aplicação para gerenciar isso.

É simples fazer essa remoção:

 String url = "https://sqs.us-east-1.amazonaws.com/403828569551/caelum-queue-jms"; AmazonSQSClient sqsClient = new AmazonSQSClient(awsCredentials); ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(url); List<Message> messages = sqsClient.receiveMessage(receiveMessageRequest).getMessages(); System.out.println("Deletando a MSG.\\n" + messages.get(0).getBody()); String messageReceiptHandle = messages.get(0).getReceiptHandle(); sqsClient.deleteMessage(new DeleteMessageRequest().withQueueUrl(url).withReceiptHandle(messageReceiptHandle)); 

Um outro serviço de mensageria que está se popularizando muito é o IronMQ ,que tem uma API REST, facilitando bastante o uso do serviço por aplicações web. O IronMQ também disponibiliza SDKs para diferentes linguagens. Vale a pena dar uma conferida.

Para aprender mais sobre o SDK da amazon e sobre o SQS, não deixe de ver o FAQ e a documentação, além desse nosso código de exemplo.

Veja outros artigos sobre Programação