Utilisez le traitement automatique des demandes par lots pour Amazon SQS avec AWS SDK for Java 2.x - AWS SDK for Java 2.x

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisez le traitement automatique des demandes par lots pour Amazon SQS avec AWS SDK for Java 2.x

L'Automatic Request Batching API for Amazon SQS est une bibliothèque de haut niveau qui fournit un moyen efficace de regrouper et de mettre en mémoire tampon les demandes pour les SQS opérations. En utilisant le traitement par lotsAPI, vous réduisez le nombre de demandesSQS, ce qui améliore le débit et minimise les coûts.

Comme les API méthodes par lots correspondent aux SqsAsyncClient méthodes (sendMessage,,,)changeMessageVisibility,deleteMessage,,receiveMessage,,,, vous pouvez utiliser le lot API en remplacement immédiat avec un minimum de modifications.

Cette rubrique explique comment configurer et utiliser le traitement automatique des demandes par lots API pour AmazonSQS.

Vérifiez les prérequis

Vous devez utiliser la version 2.28.0 ou ultérieure de SDK for Java 2.x pour avoir accès au traitement par lots. API Votre Maven pom.xml doit au moins contenir les éléments suivants.

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.28.231</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sqs</artifactId> </dependency> </dependencies>

1 Dernière version

Création d'un gestionnaire de lots

Le traitement automatique des demandes par lots API est implémenté par l'SqsAsyncBatchManagerinterface. Vous pouvez créer une instance du gestionnaire de plusieurs manières.

1. Configuration par défaut en utilisant SqsAsyncClient

Le moyen le plus simple de créer un gestionnaire de lots consiste à appeler la méthode d'batchManagerusine sur une SqsAsyncClientinstance existante. L'approche simple est illustrée dans l'extrait suivant.

SqsAsyncClient asyncClient = SqsAsyncClient.create(); SqsAsyncBatchManager sqsAsyncBatchManager = asyncClient.batchManager();

Lorsque vous utilisez cette approche, l'SqsAsyncBatchManagerinstance utilise les valeurs par défaut indiquées dans le tableau de la Remplacer les paramètres de configuration pour SqsAsyncBatchManager section. En outre, l'SqsAsyncBatchManagerinstance utilise ExecutorService l'SqsAsyncClientinstance à partir de laquelle elle a été créée.

1. Configuration personnalisée en utilisant SqsAsyncBatchManager.Builder

Pour des cas d'utilisation plus avancés, vous pouvez personnaliser le gestionnaire de lots à l'aide du SqsAsyncBatchManager.Builder. En utilisant cette approche pour créer une SqsAsyncBatchManager instance, vous pouvez affiner le comportement de traitement par lots. L'extrait suivant montre un exemple d'utilisation du générateur pour personnaliser le comportement de traitement par lots.

SqsAsyncBatchManager batchManager = SqsAsyncBatchManager.builder() .client(SqsAsyncClient.create()) .scheduledExecutor(Executors.newScheduledThreadPool(5)) .overrideConfiguration(b -> b .receiveMessageMinWaitDuration(Duration.ofSeconds(10)) .receiveMessageVisibilityTimeout(Duration.ofSeconds(1)) .receiveMessageAttributeNames(Collections.singletonList("*")) .receiveMessageSystemAttributeNames(Collections.singletonList(MessageSystemAttributeName.ALL))) .build();

Lorsque vous utilisez cette approche, vous pouvez ajuster les paramètres de l'BatchOverrideConfigurationobjet présentés dans le tableau de la Remplacer les paramètres de configuration pour SqsAsyncBatchManager section. Vous pouvez également fournir une personnalisation ScheduledExecutorServicepour le gestionnaire de lots en utilisant cette approche.

Envoyer des messages

Pour envoyer des messages avec le gestionnaire de lots, utilisez la SqsAsyncBatchManager#sendMessage méthode. Les SDK buffers les demandes et les envoie sous forme de lot lorsque les sendRequestFrequency valeurs maxBatchSize or sont atteintes.

L'exemple suivant montre une sendMessage demande immédiatement suivie d'une autre demande. Dans ce cas, les SDK deux messages sont envoyés en un seul lot.

// Sending the first message CompletableFuture<SendMessageResponse> futureOne = sqsAsyncBatchManager.sendMessage(r -> r.messageBody("One").queueUrl("queue")); // Sending the second message CompletableFuture<SendMessageResponse> futureTwo = sqsAsyncBatchManager.sendMessage(r -> r.messageBody("Two").queueUrl("queue")); // Waiting for both futures to complete and retrieving the responses SendMessageResponse messageOne = futureOne.join(); SendMessageResponse messageTwo = futureTwo.join();

Modifier le délai de visibilité des messages

Vous pouvez modifier le délai de visibilité des messages d'un lot à l'aide de SqsAsyncBatchManager#changeMessageVisibilitycette méthode. Les SDK buffers les demandes et les envoie sous forme de lot lorsque les sendRequestFrequency valeurs maxBatchSize or sont atteintes.

L'exemple suivant montre comment appeler la changeMessageVisibility méthode.

CompletableFuture<ChangeMessageVisibilityResponse> futureOne = sqsAsyncBatchManager.changeMessageVisibility(r -> r.receiptHandle("receiptHandle") .queueUrl("queue")); ChangeMessageVisibilityResponse response = futureOne.join();

Supprimer des messages

Vous pouvez supprimer des messages par lots à l'aide de SqsAsyncBatchManager#deleteMessagecette méthode. Les SDK buffers les demandes et les envoie sous forme de lot lorsque les sendRequestFrequency valeurs maxBatchSize or sont atteintes.

L'exemple suivant montre comment appeler la deleteMessage méthode.

CompletableFuture<DeleteMessageResponse> futureOne = sqsAsyncBatchManager.deleteMessage(r -> r.receiptHandle("receiptHandle") .queueUrl("queue")); DeleteMessageResponse response = futureOne.join();

Recevoir des messages

Utiliser les paramètres par défaut

Lorsque vous interrogez la SqsAsyncBatchManager#receiveMessage méthode dans votre application, le gestionnaire de lots extrait les messages de sa mémoire tampon interne, qui SDK sont automatiquement mis à jour en arrière-plan.

L'exemple suivant montre comment appeler la receiveMessage méthode.

CompletableFuture<ReceiveMessageResponse> responseFuture = sqsAsyncBatchManager.receiveMessage(r -> r.queueUrl("queueUrl"));

Utiliser des paramètres personnalisés

Si vous souhaitez personnaliser davantage la demande, par exemple en définissant des temps d'attente personnalisés et en spécifiant le nombre de messages à récupérer, vous pouvez personnaliser la demande comme indiqué dans l'exemple suivant.

CompletableFuture<ReceiveMessageResponse> response = sqsAsyncBatchManager.receiveMessage(r -> r.queueUrl("queueUrl") .waitTimeSeconds(5) .visibilityTimeout(20));
Note

Si vous appelez receiveMessage avec un ReceiveMessageRequest qui inclut l'un des paramètres suivants, SDK contourne le gestionnaire de lots et envoie une demande asynchrone receiveMessage normale :

  • messageAttributeNames

  • messageSystemAttributeNames

  • messageSystemAttributeNamesWithStrings

  • overrideConfiguration

Remplacer les paramètres de configuration pour SqsAsyncBatchManager

Vous pouvez ajuster les paramètres suivants lorsque vous créez une SqsAsyncBatchManager instance. La liste de paramètres suivante est disponible sur le BatchOverrideConfiguration.Builder.

Paramètre Description Valeur par défaut
maxBatchSize Nombre maximum de demandes par lot pour chaque SendMessageBatchRequestChangeMessageVisibilityBatchRequest, ouDeleteMessageBatchRequest. La valeur maximale est 10. 10
sendRequestFrequency

Durée avant l'envoi d'un lot, sauf si maxBatchSize elle est atteinte plus tôt. Des valeurs plus élevées peuvent réduire les demandes mais augmenter le temps de latence.

200 ms
receiveMessageVisibilityTimeout Expiration du délai de visibilité pour les messages. S'il n'est pas défini, la valeur par défaut de la file d'attente est utilisée. Par défaut de la file d'attente
receiveMessageMinWaitDuration Temps d'attente minimal pour les receiveMessage demandes. Évitez de mettre à 0 pour éviter le CPU gaspillage. 50 ms
receiveMessageSystemAttributeNames Liste des noms d'attributs système à demander pour les receiveMessage appels. Aucun
receiveMessageAttributeNames Liste des noms d'attributs à demander pour les receiveMessage appels. Aucun