Filas temporárias do Amazon SQS - Amazon Simple Queue Service

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Filas temporárias do Amazon SQS

Filas temporárias ajudam você a economizar tempo de desenvolvimento e custos de implantação ao usar padrões comuns de mensagens, como solicitação-resposta. Você pode usar o Temporary Queue Client para criar filas temporárias de alta taxa de transferência, econômicas e gerenciadas por aplicações.

O cliente mapeia várias filas temporárias (filas gerenciadas pela aplicação criadas sob demanda para um processo específico) em uma única fila do Amazon SQS automaticamente. Isso permite que o aplicativo faça menos chamadas de API e tenha uma taxa de transferência mais alta quando o tráfego é baixo para cada fila temporária. Quando uma fila temporária não está mais em uso, o cliente a limpa automaticamente, mesmo que alguns processos que usam o cliente não estejam encerrados corretamente.

Veja a seguir os benefícios das filas temporárias:

  • Elas funcionam como canais de comunicação leves para segmentos ou processos específicos.

  • É possível criá-las e excluí-las sem gerar custos adicionais.

  • Elas são compatíveis em termos de API com filas estáticas (normais) do Amazon SQS. Isso significa que o código existente que envia e recebe mensagens pode enviar e receber mensagens de filas virtuais.

Tópicos

Filas virtuais

Filas virtuais são estruturas de dados locais criadas pelo Temporary Queue Client. As filas virtuais permitem combinar vários destinos de baixo tráfego em uma única fila do Amazon SQS. Para ver as práticas recomendadas, consulte Evitar reutilizar o mesmo ID de grupo de mensagens com filas virtuais.

nota
  • Ao criar uma fila virtual, você cria apenas estruturas de dados temporárias nas quais os consumidores receberão as mensagens. Como não fazem chamadas de API para o Amazon SQS, as filas virtuais não geram custo.

  • As cotas de TPS se aplicam a todas as filas virtuais em uma única fila de host. Para ter mais informações, consulte Cotas de mensagens do Amazon SQS.

A classe de wrapper AmazonSQSVirtualQueuesClient adiciona suporte para atributos relacionados a filas virtuais. Para criar uma fila virtual, você deve chamar a ação de API CreateQueue usando o atributo HostQueueURL. Esse atributo especifica a fila existente que hospeda as filas virtuais.

O URL de uma fila virtual tem o formato a seguir.

https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue#MyVirtualQueueName

Quando um produtor chama a ação de API SendMessage ou SendMessageBatch em um URL de fila virtual, o Temporary Queue Client faz o seguinte:

  1. Extrai o nome da fila virtual.

  2. Anexa o nome da fila virtual como um atributo de mensagem adicional.

  3. Envia a mensagem para a fila de host.

Enquanto o produtor envia mensagens, um thread em segundo plano faz uma sondagem da fila de host e envia as mensagens recebidas para filas virtuais de acordo com os atributos de mensagem correspondentes.

Enquanto o consumidor chama a ação de API ReceiveMessage em um URL de fila virtual, o Temporary Queue Client bloqueia a chamada localmente até o thread de fundo enviar uma mensagem para a fila virtual. (Esse processo é semelhante à pré-busca de mensagens no Cliente assíncrono armazenado em buffer: uma única ação de API pode fornecer mensagens para até 10 filas virtuais.) A exclusão de uma fila virtual remove todos os recursos do lado do cliente sem chamar o Amazon SQS.

A classe AmazonSQSTemporaryQueuesClient transforma automaticamente todas as filas criadas em filas temporárias. Ela também cria filas de host com os mesmos atributos automaticamente, sob demanda. Os nomes dessas filas compartilham o mesmo prefixo configurável (por padrão, __RequesterClientQueues__) que as identifica como filas temporárias. Isso permite que o cliente atue como uma substituição inicial que otimiza o código existente que cria e exclui filas. O cliente também inclui as interfaces AmazonSQSRequester e AmazonSQSResponder que permitem a comunicação bidirecional entre as filas.

Padrão de mensagens de resposta a solicitação (filas virtuais)

O caso de uso mais comum de filas temporárias é o padrão de mensagens de solicitação-resposta no qual um solicitante cria uma fila temporária para receber cada mensagem de resposta. Para evitar a criação de uma fila do Amazon SQS para cada mensagem de resposta, o Temporary Queue Client (cliente de fila temporária) permite criar e excluir várias filas temporárias sem fazer chamadas de API ao Amazon SQS. Para ter mais informações, consulte Implementação de sistemas de resposta a solicitação.

O diagrama a seguir mostra uma configuração comum usando esse padrão.

Um diagrama do padrão de solicitação-resposta usado com o Amazon SQS.

Cenário de exemplo: processar uma solicitação de login

O cenário de exemplo a seguir mostra como você pode usar as interfaces AmazonSQSRequester e AmazonSQSResponder para processar uma solicitação de login do usuário.

No lado do cliente

public class LoginClient { // Specify the Amazon SQS queue to which to send requests. private final String requestQueueUrl; // Use the AmazonSQSRequester interface to create // a temporary queue for each response. private final AmazonSQSRequester sqsRequester = AmazonSQSRequesterClientBuilder.defaultClient(); LoginClient(String requestQueueUrl) { this.requestQueueUrl = requestQueueUrl; } // Send a login request. public String login(String body) throws TimeoutException { SendMessageRequest request = new SendMessageRequest() .withMessageBody(body) .withQueueUrl(requestQueueUrl); // If no response is received, in 20 seconds, // trigger the TimeoutException. Message reply = sqsRequester.sendMessageAndGetResponse(request, 20, TimeUnit.SECONDS); return reply.getBody(); } }

O envio de uma solicitação de login faz o seguinte:

  1. Cria uma fila temporária.

  2. Anexa o URL da fila temporária à mensagem como um atributo.

  3. Envia a mensagem.

  4. Recebe uma resposta da fila temporária.

  5. Exclui a fila temporária.

  6. Retorna a resposta.

No lado do servidor

O exemplo a seguir pressupõe que, após a construção, um thread é criado para sondar a fila e chamar o método handleLoginRequest() para cada mensagem. Além disso, doLogin() é um método presumido.

public class LoginServer { // Specify the Amazon SQS queue to poll for login requests. private final String requestQueueUrl; // Use the AmazonSQSResponder interface to take care // of sending responses to the correct response destination. private final AmazonSQSResponder sqsResponder = AmazonSQSResponderClientBuilder.defaultClient(); LoginServer(String requestQueueUrl) { this.requestQueueUrl = requestQueueUrl; } // Process login requests from the client. public void handleLoginRequest(Message message) { // Process the login and return a serialized result. String response = doLogin(message.getBody()); // Extract the URL of the temporary queue from the message attribute // and send the response to the temporary queue. sqsResponder.sendResponseMessage(MessageContent.fromMessage(message), new MessageContent(response)); } }

Limpeza das filas

Para garantir que o Amazon SQS recupere todos os recursos na memória usados por filas virtuais, quando a aplicação não precisar mais do Temporary Queue Client, ele deverá chamar o método shutdown(). Você também pode usar o método shutdown() da interface AmazonSQSRequester.

O Temporary Queue Client também fornece uma maneira de eliminar filas de host órfãs. Para cada fila que recebe uma chamada de API durante um período (por padrão, cinco minutos), o cliente usa a ação de API TagQueue para etiquetar uma fila que permanece em uso.

nota

Qualquer ação de API executada em uma fila será marcada como não ociosa, inclusive uma ação ReceiveMessage que não retorne mensagens.

O thread em segundo plano usa as ações de API ListQueues e ListTags para verificar todas as filas com o prefixo configurado, excluindo as filas que não foram marcadas por pelo menos cinco minutos. Dessa forma, se um cliente não for encerrado corretamente, os outros clientes ativos serão limpos depois dele. A fim de reduzir a duplicação de trabalho, todos os clientes com o mesmo prefixo se comunicam por meio de uma fila de trabalho interna compartilhada, denominada de acordo com o prefixo.