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á.
Use os exemplos de código a seguir para integrar o exemplo de caso de uso do gerenciamento de preços de autopeças com um tópico FIFO do Amazon SNS e uma fila FIFO do Amazon SQS ou uma fila padrão.
Usando um AWS SDK
Usando um AWS SDK, você cria um tópico FIFO do Amazon SNS FifoTopic
definindo seu atributo como. true
Você cria uma fila FIFO do Amazon SQS definindo seu atributo FifoQueue
como true
. Além disso, você deve adicionar o sufixo .fifo
ao nome de cada recurso FIFO. Depois de criar um tópico ou fila FIFO, não é possível convertê-lo em um tópico ou fila padrão.
O seguinte exemplo de código cria esses recursos de fila FIFO e padrão:
-
O tópico FIFO do Amazon SNS que distribui as atualizações de preços
-
As filas FIFO do Amazon SQS que fornecem essas atualizações para as aplicações de atacado e varejo
-
A fila padrão do Amazon SQS para a aplicação de análise que armazena registros, que podem ser consultados para fins de business intelligence (BI)
-
As assinaturas FIFO do Amazon SNS que conectam as três filas ao tópico
Esse exemplo define políticas de filtro nas assinaturas. Se você testar o exemplo publicando uma mensagem no tópico, faça isso com o atributo business
. Especifique retail
ou wholesale
como valor do atributo. Caso contrário, a mensagem será filtrada e não será entregue às filas inscritas. Para obter mais informações, consulte Filtragem de mensagens do Amazon SNS para tópicos FIFO do SNS.
- SDK para Java 2.x
-
nota
Tem mais sobre GitHub. Encontre o exemplo completo e saiba como configurar e executar no AWS Code Examples Repository
. Esse exemplo
-
cria um tópico FIFO do Amazon SNS, duas filas FIFO do Amazon SQS e uma fila padrão.
-
inscreve as filas no tópico e publica a mensagem no tópico.
O teste
verifica o recebimento da mensagem em cada fila. O exemplo completo também mostra a adição de políticas de acesso e exclui os recursos no final. public class PriceUpdateExample { public final static SnsClient snsClient = SnsClient.create(); public final static SqsClient sqsClient = SqsClient.create(); public static void main(String[] args) { final String usage = "\n" + "Usage: " + " <topicName> <wholesaleQueueFifoName> <retailQueueFifoName> <analyticsQueueName>\n\n" + "Where:\n" + " fifoTopicName - The name of the FIFO topic that you want to create. \n\n" + " wholesaleQueueARN - The name of a SQS FIFO queue that will be created for the wholesale consumer. \n\n" + " retailQueueARN - The name of a SQS FIFO queue that will created for the retail consumer. \n\n" + " analyticsQueueARN - The name of a SQS standard queue that will be created for the analytics consumer. \n\n"; if (args.length != 4) { System.out.println(usage); System.exit(1); } final String fifoTopicName = args[0]; final String wholeSaleQueueName = args[1]; final String retailQueueName = args[2]; final String analyticsQueueName = args[3]; // For convenience, the QueueData class holds metadata about a queue: ARN, URL, // name and type. List<QueueData> queues = List.of( new QueueData(wholeSaleQueueName, QueueType.FIFO), new QueueData(retailQueueName, QueueType.FIFO), new QueueData(analyticsQueueName, QueueType.Standard)); // Create queues. createQueues(queues); // Create a topic. String topicARN = createFIFOTopic(fifoTopicName); // Subscribe each queue to the topic. subscribeQueues(queues, topicARN); // Allow the newly created topic to send messages to the queues. addAccessPolicyToQueuesFINAL(queues, topicARN); // Publish a sample price update message with payload. publishPriceUpdate(topicARN, "{\"product\": 214, \"price\": 79.99}", "Consumables"); // Clean up resources. deleteSubscriptions(queues); deleteQueues(queues); deleteTopic(topicARN); } public static String createFIFOTopic(String topicName) { try { // Create a FIFO topic by using the SNS service client. Map<String, String> topicAttributes = Map.of( "FifoTopic", "true", "ContentBasedDeduplication", "false"); CreateTopicRequest topicRequest = CreateTopicRequest.builder() .name(topicName) .attributes(topicAttributes) .build(); CreateTopicResponse response = snsClient.createTopic(topicRequest); String topicArn = response.topicArn(); System.out.println("The topic ARN is" + topicArn); return topicArn; } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return ""; } public static void subscribeQueues(List<QueueData> queues, String topicARN) { queues.forEach(queue -> { SubscribeRequest subscribeRequest = SubscribeRequest.builder() .topicArn(topicARN) .endpoint(queue.queueARN) .protocol("sqs") .build(); // Subscribe to the endpoint by using the SNS service client. // Only Amazon SQS queues can receive notifications from an Amazon SNS FIFO // topic. SubscribeResponse subscribeResponse = snsClient.subscribe(subscribeRequest); System.out.println("The queue [" + queue.queueARN + "] subscribed to the topic [" + topicARN + "]"); queue.subscriptionARN = subscribeResponse.subscriptionArn(); }); } public static void publishPriceUpdate(String topicArn, String payload, String groupId) { try { // Create and publish a message that updates the wholesale price. String subject = "Price Update"; String dedupId = UUID.randomUUID().toString(); String attributeName = "business"; String attributeValue = "wholesale"; MessageAttributeValue msgAttValue = MessageAttributeValue.builder() .dataType("String") .stringValue(attributeValue) .build(); Map<String, MessageAttributeValue> attributes = new HashMap<>(); attributes.put(attributeName, msgAttValue); PublishRequest pubRequest = PublishRequest.builder() .topicArn(topicArn) .subject(subject) .message(payload) .messageGroupId(groupId) .messageDeduplicationId(dedupId) .messageAttributes(attributes) .build(); final PublishResponse response = snsClient.publish(pubRequest); System.out.println(response.messageId()); System.out.println(response.sequenceNumber()); System.out.println("Message was published to " + topicArn); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } }
-
Para obter detalhes da API, consulte os tópicos a seguir na Referência da API AWS SDK for Java 2.x .
-
Receber mensagens de assinaturas FIFO
Agora você pode receber atualizações de preços nas três aplicações inscritas. Conforme mostrado emExemplo de caso de uso do tópico FIFO do Amazon SNS, o ponto de entrada para cada aplicativo do consumidor é a fila do Amazon SQS, que sua AWS Lambda função correspondente pode pesquisar automaticamente. Quando uma fila do Amazon SQS é uma fonte de eventos para uma função do Lambda, o Lambda escala sua frota de sondas conforme necessário para consumir mensagens de forma eficiente.
Para obter mais informações, consulte Como usar AWS Lambda com o Amazon SQS no Guia do AWS Lambda desenvolvedor. Para obter informações sobre como criar seus próprios questionadores de filas, consulte Recomendações para filas padrão e FIFO do Amazon SQS no Amazon Simple Queue Service Developer Guide e ReceiveMessagena Amazon Simple Queue Service API Reference.
Usando AWS CloudFormation
AWS CloudFormation permite que você use um arquivo de modelo para criar e configurar uma coleção de AWS recursos juntos como uma única unidade. Esta seção tem um modelo de exemplo que cria o seguinte:
-
O tópico FIFO do Amazon SNS que distribui as atualizações de preços
-
As filas FIFO do Amazon SQS que fornecem essas atualizações para as aplicações de atacado e varejo
-
A fila padrão do Amazon SQS para a aplicação de análise que armazena registros, que podem ser consultados para fins de business intelligence (BI)
-
As assinaturas FIFO do Amazon SNS que conectam as três filas ao tópico
-
A política de filtros que especifica que as aplicações de assinante recebem somente as atualizações de preço de que precisam
nota
Se você testar esse exemplo de código publicando uma mensagem no tópico, faça isso com o atributo business
. Especifique retail
ou wholesale
como valor do atributo. Caso contrário, a mensagem será filtrada e não será entregue às filas inscritas.
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"PriceUpdatesTopic": {
"Type": "AWS::SNS::Topic",
"Properties": {
"TopicName": "PriceUpdatesTopic.fifo",
"FifoTopic": true,
"ContentBasedDeduplication": false,
"ArchivePolicy": {
"MessageRetentionPeriod": "30"
}
}
},
"WholesaleQueue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"QueueName": "WholesaleQueue.fifo",
"FifoQueue": true,
"ContentBasedDeduplication": false
}
},
"RetailQueue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"QueueName": "RetailQueue.fifo",
"FifoQueue": true,
"ContentBasedDeduplication": false
}
},
"AnalyticsQueue": {
"Type": "AWS::SQS::Queue",
"Properties": {
"QueueName": "AnalyticsQueue"
}
},
"WholesaleSubscription": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"TopicArn": {
"Ref": "PriceUpdatesTopic"
},
"Endpoint": {
"Fn::GetAtt": [
"WholesaleQueue",
"Arn"
]
},
"Protocol": "sqs",
"RawMessageDelivery": "false",
"FilterPolicyScope": "MessageBody",
"FilterPolicy": {
"business": [
"wholesale"
]
}
}
},
"RetailSubscription": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"TopicArn": {
"Ref": "PriceUpdatesTopic"
},
"Endpoint": {
"Fn::GetAtt": [
"RetailQueue",
"Arn"
]
},
"Protocol": "sqs",
"RawMessageDelivery": "false",
"FilterPolicyScope": "MessageBody",
"FilterPolicy": {
"business": [
"retail"
]
}
}
},
"AnalyticsSubscription": {
"Type": "AWS::SNS::Subscription",
"Properties": {
"TopicArn": {
"Ref": "PriceUpdatesTopic"
},
"Endpoint": {
"Fn::GetAtt": [
"AnalyticsQueue",
"Arn"
]
},
"Protocol": "sqs",
"RawMessageDelivery": "false"
}
},
"SalesQueuesPolicy": {
"Type": "AWS::SQS::QueuePolicy",
"Properties": {
"PolicyDocument": {
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "sns.amazonaws.com"
},
"Action": [
"sqs:SendMessage"
],
"Resource": "*",
"Condition": {
"ArnEquals": {
"aws:SourceArn": {
"Ref": "PriceUpdatesTopic"
}
}
}
}
]
},
"Queues": [
{
"Ref": "WholesaleQueue"
},
{
"Ref": "RetailQueue"
},
{
"Ref": "AnalyticsQueue"
}
]
}
}
}
}
Para obter mais informações sobre como implantar AWS recursos usando um AWS CloudFormation modelo, consulte Introdução no Guia do AWS CloudFormation usuário.