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

Em post anterior, explicamos os conceitos por trás do Amazon Simple Queue Service, mais conhecido como SQS, e deixamos para um post futuro a demostração de exemplos sobre como postar e consumir mensagens de uma fila. E agora o post futuro finalmente chegou.

Como o próprio nome do serviço diz,  a utilização dos serviços SQS é bem simples e direto.

Vamos começar pelos pré-requisitos para trabalhar com uma fila específica, utilizando Java como linguagem e Maven para build.

Será necessário inicialmente adicionar a dependência correta ao seu projeto para que o SDK do SQS esteja disponível, como apresentado abaixo:

<dependency>
   <groupId>com.amazonaws</groupId>
   <artifactId>aws-java-sdk-sqs</artifactId>
   <version>1.10.56</version>
</dependency>

Note que esta dependência irá trazer diversas outras dependências da Amazon por transitividade. Mas não se assuste, é normal.

Agora precisamos descobrir a URL da fila para onde iremos enviar mensagem. Isto pode ser obtido direto do console SQS na AWS, conforme indicado na Figura 1, a seguir:

Figura 1 - Obtendo a url de uma fila
Figura 1 – Obtendo a url de uma fila

Note que a url da fila neste caso é https://sqs.us-west-1.amazonaws.com/536311044217/reset-password-queue.

Você precisará também de credenciais – access key e secret key – para se autenticar no SQS programaticamente. Estas credenciais devem ser fornecidas pelo responsável pelo gerenciamento de usuários no seu ambiente ou, caso você tenha este acesso, podem ser geradas pelo IAM, conforme instruções em [1].

Vamos agora ao código, começando por um exemplo comentado de como enviar uma mensagem:

public static void main(String[] args) {
		final String accessKey = "sua-access-key";
		final String secretKey = "sua-secret-key";

		/**
		 * Note que aqui estamos usando BasicAWSCredentials, onde as chaves são
		 * informadas programaticamente. Existem outras implementações de
		 * AWSCredentials que leem as credenciais de system properties ou de
		 * arquivos de configuração. Procure explorar estas alternativas.
		 */
		AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);

		/**
		 * Aqui criamos o cliente do Amazon SQS com as credenciais.
		 */
		AmazonSQS amazonSqs = new AmazonSQSClient(credentials);
		/**
		 * Indicando a url onde queremos trabalhar
		 */
		amazonSqs.setRegion(Region.getRegion(Regions.US_WEST_1));

		/**
		 * URL da fila onde iremos colocar a mensagem
		 */
		final String QUEUE_URL = "https://sqs.us-west-1.amazonaws.com/536311044217/reset-password-queue";

		/**
		 * Mensagem propriamente dita
		 */
		final String message = "hello world";

		/**
		 * Criação do request para envio da mensagem
		 */
		SendMessageRequest request = new SendMessageRequest(QUEUE_URL, message);

		/**
		 * Envio da mensagem propriamente dito
		 */
		amazonSqs.sendMessage(request);

	}

Veja que o código é bem direto: criamos o client, construímos a mensagem e a enviamos.

Existem, entretanto, outras opções para envio de mensagens, úteis especialmente para trabalhar com grandes volumes. Procure explorar o método sendMessageBatch para envio de diversas mensagens simultaneamente.

E agora vamos ao código comentado para recebimento da mensagem enviada anteriormente.


 

	 final String accessKey = "sua-access-key";
	 final String secretKey = "sua-secret-key";

	 /**
	 * Repetimos o código para construção do client
	 */
	 AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
	 AmazonSQS amazonSqs = new AmazonSQSClient();
	 amazonSqs.setRegion(Region.getRegion(Regions.US_WEST_1));

	 /**
	 * URL da fila onde iremos buscar a mensagem
	 */
	 final String QUEUE_URL = "https://sqs.us-west-1.amazonaws.com/536311044217/reset-password-queue";

	 /**
	 * Criação do request para recebimento de mensagens
	 */
	 ReceiveMessageRequest request = new ReceiveMessageRequest(QUEUE_URL);

	 /**
	 * Limitando o numero de mensagens a serem retornadas Note que a própria
	 * Amazon estabelece um limite próprio de 10. Assim, configurar valores
	 * maiores do que 10 aqui não tem efeito.
	 */
	 request.setMaxNumberOfMessages(10);

	 /**
	 * Chamada do serviço de consulta. As mensagens retornadas por esta
	 * consulta ficarão invisíveis para outras chamdas durante o tempo
	 * configurado no Console SQS - o visibility timeout. Isto garante que
	 * eu tenha tempo suficiente para processar a mensagem sem que outra
	 * chamada a leia também.
	 */
	 ReceiveMessageResult result = amazonSqs.receiveMessage(request);

	 /**
	 * Tratando as mensagens
	 */
	 List messages = result.getMessages();
	 for (Message m : messages) {
	 System.err.println(m.getBody());

	 /**
	 * Uma vez processada a mensagem, precisamos apagá-la do SQS para
	 * que não seja consumida por outros processos
	 */
	 DeleteMessageRequest deleteRequest = new DeleteMessageRequest(QUEUE_URL, m.getReceiptHandle());
	 amazonSqs.deleteMessage(deleteRequest);
	 }

O ponto a chamar a atenção aqui é a chamada ao deleteMessage após o processamento da mensagem. Caso isto não seja feito, a mensagem ficará disponível novamente para leitura e poderá causar processamento duplicado. Assim, reforçamos  que caso o processamento da mensagem seja demorado, o visibility timeout seja configurado com um valor também alto para evitar problemas.

Bom, terminamos aqui a exemplificação das chamadas básicas do SQS e deixamos para o leitor a exploração de outros métodos e mesmo frameworks que integram com o SQS. Fica como recomendação o estudo e testes da integração Spring x AWS[2], pois facilitam ainda mais o uso da ferramenta.

Links

  1. http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html
  2. Integração Spring x AWS: https://github.com/spring-projects/spring-integration-aws

Por LUIS SERGIO F. CARNEIRO

Postado em: 02 de março de 2016

Confira outros artigos do nosso blog

Estimando Custos na AWS

08 de março de 2016

Anderson Lima

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

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

19 de outubro de 2015

Luis Sergio F. Carneiro

Deixe seu comentário