

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.

# Utilisation APIs avec Amazon SQS
En utilisant APIs

Cette rubrique fournit des informations sur la création de points de terminaison Amazon SQS, l'envoi de demandes d'API de requête à l'aide des méthodes GET et POST et l'utilisation d'actions d'API par lots. Pour obtenir des informations détaillées sur les [actions](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Operations.html) Amazon SQS, notamment les paramètres, les erreurs, les exemples et les [types de données](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Types.html), consultez la [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/).

Pour accéder à Amazon SQS à l'aide de différents langages de programmation, vous pouvez également utiliser [AWS SDKs](https://aws.amazon.com/tools/#sdk)les fonctionnalités automatiques suivantes :
+ Signature cryptographique des requêtes de service
+ Nouvelles tentatives de requête
+ Gestion des réponses d'erreur

Pour de plus amples informations, veuillez consulter [Utilisation d'Amazon SQS avec un SDK AWS](sdk-general-information-section.md).

Pour plus d'informations sur l'outil de ligne de commande, consultez les sections Amazon SQS dans la [https://docs.aws.amazon.com/cli/latest/reference/sqs/index.html](https://docs.aws.amazon.com/cli/latest/reference/sqs/index.html) et la [https://docs.aws.amazon.com/powershell/latest/reference/](https://docs.aws.amazon.com/powershell/latest/reference/).

**Amazon SQS APIs avec protocole JSON AWS **

[Amazon SQS utilise le protocole AWS JSON comme mécanisme de transport pour tous les Amazon APIs SQS sur les versions du AWS SDK spécifiées.](sqs-json-faqs.md#json-protocol-getting-started) AWS Le protocole JSON fournit un débit plus élevé, une latence plus faible et une application-to-application communication plus rapide. AWS Le protocole JSON est plus efficace en serialization/deserialization termes de requêtes et de réponses que le protocole de AWS requête. Si vous préférez toujours utiliser le protocole de AWS requête avec SQS APIs, consultez [Quels sont les langages pris en charge pour le protocole AWS JSON utilisé dans Amazon SQS ? APIs](sqs-json-faqs.md#json-protocol-supported-languages) les versions du AWS SDK qui prennent en charge le protocole de requête Amazon AWS SQS.

Amazon SQS utilise le protocole AWS JSON pour communiquer entre les clients du AWS SDK (par exemple, Java, Python, Golang JavaScript) et le serveur Amazon SQS. Une requête HTTP d'une opération d'API Amazon SQS accepte une entrée au format JSON. L'opération Amazon SQS est exécutée et la réponse d'exécution est renvoyée au client du SDK au format JSON. Comparé à la AWS requête, le AWS JSON est plus simple, plus rapide et plus efficace pour transporter les données entre le client et le serveur.
+ AWS Le protocole JSON joue le rôle de médiateur entre le client et le serveur Amazon SQS.
+ Le serveur ne comprend pas le langage de programmation dans lequel l'opération Amazon SQS est créée, mais il comprend le protocole AWS JSON.
+ Le protocole AWS JSON utilise la sérialisation (conversion de l'objet au format JSON) et la désérialisation (conversion du format JSON en objet) entre le client et le serveur Amazon SQS.

Pour plus d'informations sur le protocole AWS JSON avec Amazon SQS, consultez. [Protocole JSON Amazon SQS AWS FAQs](sqs-json-faqs.md)

AWS Le protocole JSON est disponible sur la [version du AWS SDK](sqs-json-faqs.md#json-protocol-getting-started) spécifiée. Pour consulter la version et les dates de sortie du SDK selon les variantes linguistiques, consultez la [matrice de prise en charge des versions AWS SDKs et outils](https://docs.aws.amazon.com/sdkref/latest/guide/version-support-matrix.html) dans le guide de *référence AWS SDKs and Tools*

# Effectuer des demandes d'API de requête à l'aide du protocole AWS JSON dans Amazon SQS
Effectuer des demandes d'API de requête à l'aide du protocole AWS JSON

Cette rubrique explique comment créer un point de terminaison Amazon SQS, effectuer des requêtes POST et interpréter les réponses.

**Note**  
AWS Le protocole JSON est pris en charge pour la plupart des variantes linguistiques. Pour accéder à la liste complète des langages pris en charge, consultez [Quels sont les langages pris en charge pour le protocole AWS JSON utilisé dans Amazon SQS ? APIs](sqs-json-faqs.md#json-protocol-supported-languages).

## Constitution d'un point de terminaison


Afin d'utiliser des files d'attente Amazon SQS, vous devez construire un point de terminaison. Pour plus d'informations sur les points de terminaison Amazon SQS, consultez les pages suivantes dans le *Référence générale d'Amazon Web Services* :
+ [Points de terminaison régionaux](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints)
+ [Points de terminaison et quotas Amazon Simple Queue Service](https://docs.aws.amazon.com/general/latest/gr/sqs-service)

Chaque point de terminaison Amazon SQS est indépendant. Par exemple, si deux files d'attente sont nommées *MyQueue* et que l'une d'entre elles a le point de terminaison `sqs.us-east-2.amazonaws.com` tandis que l'autre a le point de terminaison `sqs.eu-west-2.amazonaws.com`, les deux files d'attente n'ont aucune donnée en commun.

L'exemple suivant correspond à un point de terminaison lançant une requête pour créer une file d'attente. 

```
POST / HTTP/1.1
Host: sqs.us-west-2.amazonaws.com
X-Amz-Target: AmazonSQS.CreateQueue
X-Amz-Date: <Date>
Content-Type: application/x-amz-json-1.0
Authorization: <AuthParams>
Content-Length: <PayloadSizeBytes>
Connection: Keep-Alive 
{
    "QueueName":"MyQueue",
    "Attributes": {
        "VisibilityTimeout": "40"
    },
    "tags": {
        "QueueType": "Production"
    }
}
```

**Note**  
Les noms et les files d'attente URLs distinguent les majuscules et minuscules.  
La structure de *`AUTHPARAMS`* dépend de la signature de la demande d'API. Pour plus d'informations, consultez [Signing AWS API Requests](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) dans le *manuel Amazon Web Services General Reference*.

## Envoi de requête POST


Une demande POST Amazon SQS envoie des paramètres de requête sous forme de formulaire dans le corps d'une demande HTTP.

Voici un exemple d'en-tête HTTP avec `X-Amz-Target` défini sur `AmazonSQS.<operationName>` et d'en-tête HTTP avec `Content-Type` défini sur `application/x-amz-json-1.0`.

```
POST / HTTP/1.1
Host: sqs.<region>.<domain>
X-Amz-Target: AmazonSQS.SendMessage
X-Amz-Date: <Date>
Content-Type: application/x-amz-json-1.0
Authorization: <AuthParams>
Content-Length: <PayloadSizeBytes>
Connection: Keep-Alive 
{
    "QueueUrl": "https://sqs.<region>.<domain>/<awsAccountId>/<queueName>/",
    "MessageBody": "This is a test message"
}
```

Cette demande POST HTTP envoie un message à une file d'attente Amazon SQS.

**Note**  
Les deux en-têtes HTTP `X-Amz-Target` et `Content-Type` sont obligatoires.  
Votre client HTTP peut ajouter d'autres éléments à la requête HTTP, en fonction de la version HTTP du client.

# Interprétation des réponses de l'API JSON Amazon SQS


Lorsque vous envoyez une demande à Amazon SQS, celui-ci renvoie une réponse JSON avec les résultats. La structure de réponse dépend de l'action d'API que vous avez utilisée.

Pour comprendre le détail de ces réponses, voir :
+ L'action d'API spécifique dans les [actions d'API](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Operations.html) du manuel *Amazon Simple Queue Service API Reference*
+ La [Protocole JSON Amazon SQS AWS FAQs](sqs-json-faqs.md)

## Structure d'une réponse JSON positive


Si la demande aboutit, l'élément de réponse principal est `x-amzn-RequestId`, qui contient l'identifiant unique universel (UUID) de la demande, ainsi que d'autres champs de réponse ajoutés. Par exemple, la réponse [https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html) suivante contient le champ `QueueUrl`, qui contient à son tour l'URL de la file d'attente créée.

```
HTTP/1.1 200 OK
x-amzn-RequestId: <requestId>
Content-Length: <PayloadSizeBytes>
Date: <Date>
Content-Type: application/x-amz-json-1.0
{
    "QueueUrl":"https://sqs.us-east-1.amazonaws.com/111122223333/MyQueue"
}
```

## Structure d'une réponse d'erreur JSON


Si une demande échoue, Amazon SQS renvoie la réponse principale, y compris l'en-tête HTTP et le corps du message.

Dans l'en-tête HTTP, `x-amzn-RequestId` contient l'UUID de la demande. `x-amzn-query-error` contient deux informations : le type d'erreur et s'il s'agit d'une erreur du producteur ou du consommateur. 

Dans le corps de la réponse, `"__type"` indique les autres détails de l'erreur et `Message` indique la condition d'erreur dans un format lisible. 

Vous trouverez ci-dessous un exemple de réponse d'erreur au format JSON :

```
HTTP/1.1 400 Bad Request
x-amzn-RequestId: 66916324-67ca-54bb-a410-3f567a7a0571
x-amzn-query-error: AWS.SimpleQueueService.NonExistentQueue;Sender
Content-Length: <PayloadSizeBytes>
Date: <Date>
Content-Type: application/x-amz-json-1.0
{
    "__type": "com.amazonaws.sqs#QueueDoesNotExist",
    "message": "The specified queue does not exist."
}
```

# Protocole JSON Amazon SQS AWS FAQs


Cette rubrique couvre les questions fréquemment posées concernant l'utilisation du protocole AWS JSON avec Amazon SQS.

## Qu'est-ce que le protocole AWS JSON et en quoi diffère-t-il des demandes et réponses d'API Amazon SQS existantes ?


JSON est l'une des méthodes de connexion les plus utilisées et acceptées pour la communication entre des systèmes hétérogènes. Amazon SQS utilise le JSON comme moyen de communication entre un client AWS SDK (par exemple, Java, Python, Golang) et le serveur JavaScript Amazon SQS. La requête HTTP d'une opération d'API Amazon SQS accepte une entrée sous forme de JSON. L'opération Amazon SQS est exécutée et la réponse d'exécution est partagée avec le client du SDK sous forme de JSON. Comparé à la requête AWS , JSON est plus efficace pour transporter les données entre le client et le serveur. 
+ Le protocole Amazon SQS AWS JSON joue le rôle de médiateur entre le client et le serveur Amazon SQS.
+ Le serveur ne comprend pas le langage de programmation dans lequel l'opération Amazon SQS est créée, mais il comprend le protocole AWS JSON.
+ Le protocole Amazon SQS AWS JSON utilise la sérialisation (conversion de l'objet au format JSON) et la désérialisation (conversion du format JSON en objet) entre le client et le serveur Amazon SQS.

## Comment démarrer avec les protocoles AWS JSON pour Amazon SQS ?


Pour commencer à utiliser la dernière version du AWS SDK afin d'accélérer la messagerie pour Amazon SQS, mettez à niveau AWS votre SDK vers la version spécifiée ou vers une version ultérieure. Pour en savoir plus sur les clients SDK, consultez la colonne Guide dans le tableau ci-dessous.

Voici une liste des versions du SDK dans les variantes linguistiques du protocole AWS JSON à utiliser avec Amazon APIs SQS :


| Language | Référentiel client SDK | Version du client SDK requise | Guide | 
| --- | --- | --- | --- | 
|  C\$1\$1  |  [frais/ aws-sdk-cpp](https://github.com/aws/aws-sdk-cpp)  |  [1,11,98](https://github.com/aws/aws-sdk-cpp/releases/tag/1.11.198)  |  [AWS SDK pour C\$1\$1](https://aws.amazon.com/sdk-for-cpp/)  | 
|  Golang 1.x  |  [frais/ aws-sdk-go](https://github.com/aws/aws-sdk-go)  |  [v1.47.7](https://github.com/aws/aws-sdk-go/releases/tag/v1.47.7)  |  [AWS SDK pour Go](https://aws.amazon.com/sdk-for-go/)  | 
|  Golang 2.x  |  [mousquettes/ 2 aws-sdk-go-v](https://github.com/aws/aws-sdk-go-v2)  |  [v1.28.0](https://github.com/aws/aws-sdk-go-v2/blob/release-2023-11-09/service/sqs/CHANGELOG.md#v1270-2023-11-09)  |  [AWS SDK pour Go V2](https://aws.github.io/aws-sdk-go-v2/docs/)  | 
|  Java 1.x  |  [frais/ aws-sdk-java](https://github.com/aws/aws-sdk-java)  |  [1,12,585](https://github.com/aws/aws-sdk-java/releases/tag/1.12.585)  |  [AWS SDK pour Java](https://aws.amazon.com/sdk-for-java/)  | 
|  Java 2.x  |  [mousquettes/ 2 aws-sdk-java-v](https://github.com/aws/aws-sdk-java-v2)  |  [2,21,19](https://github.com/aws/aws-sdk-java-v2/releases/tag/2.21.19)  |  [AWS SDK pour Java](https://aws.amazon.com/sdk-for-java/)  | 
|  JavaScript v2.x  |  [frais/ aws-sdk-js](https://github.com/aws/aws-sdk-js)  |  [JavaScript sur AWS](https://aws.amazon.com/developer/language/javascript/)  | 
|  JavaScript v3.x  |  [frais/ 3 aws-sdk-js-v](https://github.com/aws/aws-sdk-js-v3)  |  [v3.447.0](https://github.com/aws/aws-sdk-js-v3/releases/tag/v3.447.0)  |  [JavaScript sur AWS](https://aws.amazon.com/developer/language/javascript/)  | 
|  .NET  |  [frais/ aws-sdk-net](https://github.com/aws/aws-sdk-net)  |  [3,7,681,0](https://github.com/aws/aws-sdk-net/releases/tag/3.7.681.0)  |  [AWS SDK pour .NET](https://aws.amazon.com/sdk-for-net/)  | 
|  PHP  |  [frais/ aws-sdk-php](https://github.com/aws/aws-sdk-php)  |  [3,285,2](https://github.com/aws/aws-sdk-php/releases/tag/3.285.2)  |  [AWS SDK pour PHP](https://aws.amazon.com/sdk-for-php/)  | 
|  Python-boto3  |   [boto/boto3](https://github.com/boto/boto3)   |  [1,28,82](https://github.com/boto/boto3/releases/tag/1.28.82)  |  [AWS SDK pour Python (Boto3)](https://aws.amazon.com/sdk-for-python/)  | 
|  Python-botocore  |   [boto/botocore](https://github.com/boto/botocore/)   |  [1,31,82](https://github.com/boto/botocore/releases/tag/1.31.82)  |  [AWS SDK pour Python (Boto3)](https://aws.amazon.com/sdk-for-python/)  | 
|  awscli  |  [AWS CLI](https://github.com/aws/aws-cli)  |  [1,29,82](https://github.com/aws/aws-cli/releases/tag/1.29.82)  |  [Interface de ligne de commande AWS](https://aws.amazon.com/cli/)  | 
|  Ruby  |  [frais/ aws-sdk-ruby](https://github.com/aws/aws-sdk-ruby)  |  [1,67,0](https://rubygems.org/gems/aws-sdk-sqs/versions/1.67.0)  |  [AWS SDK pour Ruby](https://aws.amazon.com/sdk-for-ruby/)  | 

## Quels sont les risques liés à l'activation du protocole JSON pour mes charges de travail Amazon SQS ?


Si vous utilisez une implémentation personnalisée du AWS SDK ou une combinaison de clients personnalisés et d'un AWS SDK pour interagir avec Amazon SQS qui AWS génère des réponses basées sur des requêtes (également appelées XML), cela peut être incompatible avec le protocole JSON. AWS Si vous rencontrez des problèmes, contactez le AWS Support.

## Et si j'utilise déjà la dernière version du AWS SDK, mais que ma solution open source ne prend pas en charge le format JSON ?


Vous devez remplacer la version de votre kit SDK par la version antérieure à celle que vous utilisez. Voir [Comment démarrer avec les protocoles AWS JSON pour Amazon SQS ?](#json-protocol-getting-started) pour plus d'informations. AWS Les versions du SDK répertoriées dans [Comment démarrer avec les protocoles AWS JSON pour Amazon SQS ?](#json-protocol-getting-started) utilisent le protocole filaire JSON pour Amazon APIs SQS. Si vous remplacez votre AWS SDK par la version précédente, votre Amazon APIs SQS utilisera AWS la requête.

## Quels sont les langages pris en charge pour le protocole AWS JSON utilisé dans Amazon SQS ? APIs


Amazon SQS prend en charge toutes les variantes linguistiques généralement AWS SDKs disponibles (GA). Actuellement, nous ne prenons pas en charge Kotlin, Rust ou Swift. Pour en savoir plus sur les autres variantes de langage, consultez la section [Outils pour créer sur AWS](https://aws.amazon.com/developer/tools/).

## Quelles sont les régions prises en charge pour le protocole AWS JSON utilisé dans Amazon SQS APIs


Amazon SQS prend en charge le protocole AWS JSON dans toutes les [AWS régions](https://docs.aws.amazon.com/general/latest/gr/sqs-service.html) où Amazon SQS est disponible. 

## À quelles améliorations de latence puis-je m'attendre lors de la mise à niveau vers les versions du AWS SDK spécifiées pour Amazon SQS à l'aide AWS du protocole JSON ?


AWS Le protocole JSON est plus efficace pour la sérialisation et la désérialisation des demandes et des réponses que le protocole de AWS requête. Basé sur des tests de AWS performance pour une charge utile de messages de 5 Ko, le protocole JSON pour Amazon SQS end-to-end réduit la latence de traitement des messages jusqu'à 23 % et réduit l'utilisation du processeur et de la mémoire côté client de l'application. 

## Le protocole de AWS requête sera-t-il obsolète ?


AWS le protocole de requête continuera d'être pris en charge. Vous pouvez continuer à utiliser le protocole de AWS requête tant que la version de votre AWS SDK est définie sur une version précédente autre que celle répertoriée dans [Comment démarrer avec les protocoles AWS JSON pour Amazon SQS](#json-protocol-getting-started).

## Où puis-je trouver plus d'informations sur le protocole AWS JSON ?


Vous trouverez plus d'informations sur le protocole JSON dans [Protocole AWS JSON 1.0](https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html) dans la documentation de *Smithy*. Pour en savoir plus sur les requêtes d'API Amazon SQS avec le protocole AWS JSON, consultez [Effectuer des demandes d'API de requête à l'aide du protocole AWS JSON dans Amazon SQS](sqs-making-api-requests-json.md).

# Effectuer des demandes d'API de requête à l'aide du protocole de AWS requête dans Amazon SQS
Effectuer des demandes d'API de requête à l'aide du protocole de AWS requête

Cette rubrique explique comment créer un point de terminaison Amazon SQS, effectuer des requêtes GET et POST et interpréter les réponses.

## Constitution d'un point de terminaison


Afin d'utiliser des files d'attente Amazon SQS, vous devez construire un point de terminaison. Pour plus d'informations sur les points de terminaison Amazon SQS, consultez les pages suivantes dans la *Référence générale d'Amazon Web Services* :
+ [Points de terminaison régionaux](https://docs.aws.amazon.com/general/latest/gr/rande.html#sqs_region)
+ [Points de terminaison et quotas Amazon Simple Queue Service](https://docs.aws.amazon.com/general/latest/gr/sqs-service)

Chaque point de terminaison Amazon SQS est indépendant. Par exemple, si deux files d'attente sont nommées *MyQueue* et que l'une d'entre elles a le point de terminaison `sqs.us-east-2.amazonaws.com` tandis que l'autre a le point de terminaison `sqs.eu-west-2.amazonaws.com`, les deux files d'attente n'ont aucune donnée en commun.

L'exemple suivant correspond à un point de terminaison lançant une requête pour créer une file d'attente. 

```
https://sqs.eu-west-2.amazonaws.com/   
?Action=CreateQueue
&DefaultVisibilityTimeout=40
&QueueName=MyQueue
&Version=2012-11-05
&AUTHPARAMS
```

**Note**  
Les noms et les files d'attente URLs distinguent les majuscules et minuscules.  
La structure de *`AUTHPARAMS`* dépend de la signature de la demande d'API. Pour plus d'informations, consultez [Signing AWS API Requests](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) dans le *manuel Amazon Web Services General Reference*.

## Envoi de requête GET


Une requête GET Amazon SQS est structurée comme une URL se composant des éléments suivants :
+ **Point de terminaison** : ressource sur laquelle la requête agit ([nom de la file d'attente et URL](sqs-queue-message-identifiers.md#queue-name-url)), par exemple : `https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue`
+ **Action** : [action](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Operations.html) que vous souhaitez effectuer sur le point de terminaison. Un point d'interrogation (`?`) sépare le point de terminaison de l'action, par exemple : `?Action=SendMessage&MessageBody=Your%20Message%20Text`.
+ **Paramètres** : tout paramètre de demande. Chaque paramètre est séparé par une esperluette (`&`), par exemple : `&Version=2012-11-05&AUTHPARAMS`. 

Voici un exemple de requête GET qui envoie un message à une file d'attente Amazon SQS.

```
https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue
?Action=SendMessage&MessageBody=Your%20message%20text
&Version=2012-11-05
&AUTHPARAMS
```

**Note**  
Les noms et les files d'attente URLs distinguent les majuscules et minuscules.  
Dans la mesure où les requêtes GET URLs le sont, vous devez encoder toutes les valeurs de paramètres en URL. Comme les espaces ne sont pas autorisés URLs, chaque espace est codé en URL sous la forme. `%20` Pour faciliter la lecture, le reste de l'exemple n'a pas été encodé selon le format URL.

## Envoi de requête POST


Une demande POST Amazon SQS envoie des paramètres de requête sous forme de formulaire dans le corps d'une demande HTTP.

L'exemple suivant illustre un en-tête HTTP avec `Content-Type` défini sur `application/x-www-form-urlencoded`.

```
POST /123456789012/MyQueue HTTP/1.1
Host: sqs.us-east-2.amazonaws.com
Content-Type: application/x-www-form-urlencoded
```

L'en-tête est suivi d'une requête GET `[form-urlencoded](https://www.w3.org/MarkUp/html-spec/html-spec_8.html#SEC8.2)` qui envoie un message à une file d'attente Amazon SQS. Chaque paramètre est séparé par une esperluette (`&`).

```
Action=SendMessage
&MessageBody=Your+Message+Text
&Expires=2020-10-15T12%3A00%3A00Z
&Version=2012-11-05
&AUTHPARAMS
```

**Note**  
Seul l'en-tête HTTP `Content-Type` est obligatoire. L'élément `AUTHPARAMS` est le même que pour la requête GET.  
Votre client HTTP peut ajouter d'autres éléments à la requête HTTP, en fonction de la version HTTP du client.

# Interprétation des réponses de l'API XML Amazon SQS


Lorsque vous envoyez une demande à Amazon SQS, celui-ci renvoie une réponse XML contenant les résultats de la demande. Pour comprendre la structure et les détails de ces réponses, reportez-vous aux [actions d'API](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_Operations.html) spécifiques dans le manuel *Amazon Simple Queue Service API Reference*.

## Structure d'une réponse XML positive


Si la requête a abouti, l'élément de réponse principal porte le nom de l'action, mais avec `Response` ajouté (par exemple, `ActionNameResponse`).

Il contient les éléments enfants suivants :
+ **`ActionNameResult`** : contient un élément spécifique à l'action. Par exemple, l'élément `CreateQueueResult` contient l'élément `QueueUrl`, qui contient à son tour l'URL de la file d'attente créée.
+ **`ResponseMetadata`** : contient le `RequestId` qui contient à son tour l'UUID (Universal Unique Identifier) de la requête.

Voici un exemple de réponse ayant abouti au format XML :

```
<CreateQueueResponse
   xmlns=https://sqs.us-east-2.amazonaws.com/doc/2012-11-05/
   xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
   xsi:type=CreateQueueResponse>
   <CreateQueueResult>
      <QueueUrl>https://sqs.us-east-2.amazonaws.com/770098461991/queue2</QueueUrl>
   </CreateQueueResult>
   <ResponseMetadata>
      <RequestId>cb919c0a-9bce-4afe-9b48-9bdf2412bb67</RequestId>
   </ResponseMetadata>
</CreateQueueResponse>
```

## Structure d'une réponse d'erreur XML


Si une requête échoue, Amazon SQS renvoie toujours l'élément de réponse principal `ErrorResponse`. Il contient un élément `Error` et un élément `RequestId`.

L'élément `Error` contient les éléments enfants suivants :
+ **`Type`** : indique si l'erreur est survenue au niveau du producteur ou du consommateur.
+ **`Code`** : spécifie le type d'erreur.
+ **`Message`** : spécifie la condition d'erreur dans un format lisible.
+ **`Detail`** : (facultatif) spécifie des détails supplémentaires sur l'erreur.

L'élément `RequestId` contient l'UUID de la requête.

Voici un exemple de réponse d'erreur au format XML :

```
<ErrorResponse>
   <Error>
      <Type>Sender</Type>
      <Code>InvalidParameterValue</Code>
      <Message>
         Value (quename_nonalpha) for parameter QueueName is invalid.
         Must be an alphanumeric String of 1 to 80 in length.
      </Message>
   </Error>
   <RequestId>42d59b56-7407-4c4a-be0f-4c88daeea257</RequestId>
</ErrorResponse>
```

# Authentification des demandes pour Amazon SQS
Authentification des requêtes

L'authentification est le processus d'identification et de vérification de la partie qui envoie une requête. Au cours de la première étape de l'authentification, AWS vérifie l'identité du créateur et si celui-ci est [enregistré pour utiliser AWS](https://aws.amazon.com/) (pour plus d'informations, consultez [Étape 1 : créer un utilisateur Compte AWS et IAM](sqs-setting-up.md#sqs-creating-aws-account)). Ensuite, AWS respecte la procédure suivante :

1. Le producteur (expéditeur) obtient les autorisations requises.

1. Le créateur envoie une requête et l'autorisation au consommateur (destinataire).

1. Le consommateur utilise l'autorisation pour vérifier si le producteur a envoyé la requête.

1. L'une des situations suivantes se produit :
   + Si l'authentification réussit, le consommateur procède au traitement de la requête.
   + Si l'authentification échoue, le consommateur rejette la requête et renvoie une erreur.

## Processus d'authentification de base avec HMAC-SHA


Lorsque vous accédez à Amazon SQS grâce à l'API Query, vous devez fournir les éléments suivants pour authentifier votre demande :
+ L'**identifiant de clé d'AWS accès** qui vous identifie Compte AWS et qui est AWS utilisé pour rechercher votre clé d'accès secrète.
+ La **signature de demande HMAC-SHA**, calculée à l'aide de votre clé d'accès secrète (un secret partagé connu de vous seul AWS ; pour plus d'informations, voir). [RFC2104](http://www.faqs.org/rfcs/rfc2104.html) Le [kit SDK AWS](https://aws.amazon.com/code/) gère le processus de signature. Toutefois, si vous soumettez une requête de requête via HTTP ou HTTPS, vous devez inclure une signature dans chacune de ces requêtes.

  1. Dérivez une clé de signature de Signature Version 4. Pour plus d'informations, consultez [Dérivation d'une clé de signature avec Java](https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-java).
**Note**  
Amazon SQS prend en charge la version 4 de Signature, qui fournit une sécurité et des SHA256 performances améliorées par rapport aux versions précédentes. Lorsque vous créez des applications qui utilisent Amazon SQS, optez pour Signature version 4.

  1. Codez en Base64 la signature de la requête. C'est ce que fait l'exemple de code Java suivant :

     ```
     package amazon.webservices.common;
     
     // Define common routines for encoding data in AWS requests.
     public class Encoding {
     
         /* Perform base64 encoding of input bytes.
          * rawData is the array of bytes to be encoded.
          * return is the base64-encoded string representation of rawData.
          */
         public static String EncodeBase64(byte[] rawData) {
             return Base64.encodeBytes(rawData);
         }
     }
     ```
+ **Horodatage (ou expiration)** de la requête. L'horodatage que vous utilisez dans la requête doit être un objet `dateTime`, avec [la date complète suivie des heures, des minutes et des secondes](http://www.w3.org/TR/xmlschema-2/#dateTime). Par exemple : `2007-01-31T23:59:59Z` Bien que ce ne soit pas obligatoire, nous vous recommandons de fournir l'heure système affichée dans la zone d'heure de l'heure universelle coordonnée (Heure de Greenwich).
**Note**  
Assurez-vous que votre serveur affiche l'heure correcte. Si vous spécifiez un horodatage (plutôt qu'une expiration), la demande expire automatiquement 15 minutes après l'heure spécifiée (AWS ne traite pas les demandes dont l'horodatage est daté de plus de 15 minutes avant l'heure actuelle sur les serveurs). AWS   
Si vous utilisez .NET, vous ne devez pas envoyer des heures systèmes excessivement spécifiques, en raison des diverses propositions existant sur la façon de renoncer à une précision horaire absolue. Dans ce cas, vous devez créer manuellement les objets `dateTime` avec une précision ne dépassant pas une milliseconde.

## Partie 1 : Demande de l'utilisateur


Voici le processus que vous devez suivre pour authentifier les AWS demandes à l'aide d'une signature de demande HMAC-SHA.

![\[Schéma décrivant la demande de l'utilisateur.\]](http://docs.aws.amazon.com/fr_fr/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-basic-authentication-process-hmac-user.png)


1. Créez une demande pour AWS. 

1. Calculez une signature de code d'authentification du message avec hachage à clés (HMAC-SHA) à l'aide de votre clé d'accès secrète.

1. Incluez la signature et l'identifiant de votre clé d'accès dans la demande, puis envoyez la demande à AWS.

## Partie 2 : La réponse de AWS


AWS lance le processus suivant en réponse.

![\[Schéma décrivant la réponse de AWS.\]](http://docs.aws.amazon.com/fr_fr/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-basic-authentication-process-hmac-aws.png)


1. AWS utilise l'ID de clé d'accès pour rechercher votre clé d'accès secrète.

1. AWS génère une signature à partir des données de la demande et de la clé d'accès secrète, en utilisant le même algorithme que celui que vous avez utilisé pour calculer la signature que vous avez envoyée dans la demande.

1. L'une des situations suivantes se produit :
   + Si la signature AWS générée correspond à celle que vous avez envoyée dans la demande, AWS considère que la demande est authentique.
   + Si la comparaison échoue, la demande est rejetée et AWS renvoie une erreur. 

# Actions groupées Amazon SQS
Actions de traitement par lots

Amazon SQS propose des actions par lots pour vous aider à réduire les coûts et à manipuler jusqu'à 10 messages en une seule action. Ces actions par lots incluent :
+ `[SendMessageBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessageBatch.html)`
+ `[DeleteMessageBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessageBatch.html)`
+ `[ChangeMessageVisibilityBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibilityBatch.html)`

Les actions par lots vous permettent d'effectuer plusieurs opérations en un seul appel d'API, ce qui permet d'optimiser les performances et de réduire les coûts. Vous pouvez tirer parti de la fonctionnalité de traitement par lots à l'aide de l'API de requête ou de n'importe quel AWS SDK prenant en charge les actions par lots Amazon SQS.

**Détails importants**
+ **Limite de taille des messages :** la taille totale de tous les messages envoyés lors d'un seul `SendMessageBatch` appel ne peut pas dépasser 1 048 576 octets (1 MiB)
+ **Autorisations :** vous ne pouvez pas définir d'autorisations explicitement pour `SendMessageBatch``DeleteMessageBatch`, ou`ChangeMessageVisibilityBatch`. Définissez plutôt des autorisations pour `SendMessage``DeleteMessage`, ou `ChangeMessageVisibility` définissez des autorisations pour les versions par lots correspondantes des actions.
+ **Support de console :** la console Amazon SQS ne prend pas en charge les actions par lots. Vous devez utiliser l'API de requête ou un AWS SDK pour effectuer des opérations par lots.

## Actions de message par lots


Pour optimiser davantage les coûts et l'efficacité, prenez en compte les meilleures pratiques suivantes pour les actions liées aux messages par lots :
+ **Actions d'API par lots :** utilisez les [actions d'API par lots Amazon SQS](#sqs-batch-api-actions) pour envoyer, recevoir et supprimer des messages, et pour modifier le délai de visibilité des messages pour plusieurs messages en une seule action. Cela réduit le nombre d'appels d'API et les coûts associés.
+ [Mise en **mémoire tampon côté client et interrogation longue :** combinez la mise en mémoire tampon côté client avec le traitement par lots de demandes en utilisant une interrogation longue avec le client asynchrone mis en mémoire tampon inclus dans le.](sqs-client-side-buffering-request-batching.md) AWS SDK pour Java Cette approche permet de minimiser le nombre de demandes et d'optimiser le traitement de gros volumes de messages.

**Note**  
Le client asynchrone en mémoire tampon Amazon SQS ne prend actuellement pas en charge les files d'attente FIFO.

# Activation de la mise en mémoire tampon côté client et du traitement par lots des demandes avec Amazon SQS


Le kit [AWS SDK pour Java](https://aws.amazon.com/sdkforjava/) inclut `AmazonSQSBufferedAsyncClient` qui accède à Amazon SQS. Ce client permet un traitement simple par lots de demandes à l'aide de la mise en mémoire tampon côté client. Les appels passés depuis le client sont d'abord mis en mémoire tampon, puis envoyés sous forme de demande groupée à Amazon SQS.

La mise en tampon côté client autorise la mise en tampon et l'envoi en tant que demande par lots de 10 requêtes au maximum, ce qui réduit les coûts d'utilisation d'Amazon SQS et le nombre de requêtes envoyées. `AmazonSQSBufferedAsyncClient` met en tampon les appels synchrones et asynchrones. Les demandes par lots et la prise en charge de l'[attente active de longue durée](sqs-short-and-long-polling.md) peuvent également permettre d'augmenter le débit. Pour de plus amples informations, veuillez consulter [Augmenter le débit grâce à la mise à l'échelle horizontale et au traitement par lots d'actions avec Amazon SQS](sqs-throughput-horizontal-scaling-and-batching.md).

Dans la mesure où `AmazonSQSBufferedAsyncClient` implémente la même interface qu'`AmazonSQSAsyncClient`, la migration d'`AmazonSQSAsyncClient` vers `AmazonSQSBufferedAsyncClient` requiert généralement très peu de changements du code existant.

**Note**  
Le client asynchrone en mémoire tampon Amazon SQS ne prend actuellement pas en charge les files d'attente FIFO.

## Utilisation d'Amazon SQSBuffered AsyncClient


Avant de commencer, complétez les étapes détaillées dans [Configuration d'Amazon SQS](sqs-setting-up.md). 

### AWS SDK pour Java 1.x


Pour le AWS SDK for Java 1.x, vous pouvez en créer un `AmazonSQSBufferedAsyncClient` nouveau en vous basant sur l'exemple suivant :

```
// Create the basic Amazon SQS async client
final AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient();
 
// Create the buffered client
final AmazonSQSAsync bufferedSqs = new AmazonSQSBufferedAsyncClient(sqsAsync);
```

Après avoir créé le nouveau `AmazonSQSBufferedAsyncClient`, utilisez-le pour envoyer plusieurs demandes à Amazon SQS (comme avec `AmazonSQSAsyncClient`), par exemple :

```
final CreateQueueRequest createRequest = new CreateQueueRequest().withQueueName("MyQueue");
 
final CreateQueueResult res = bufferedSqs.createQueue(createRequest);
 
final SendMessageRequest request = new SendMessageRequest();
final String body = "Your message text" + System.currentTimeMillis();
request.setMessageBody( body );
request.setQueueUrl(res.getQueueUrl());
 
final Future<SendMessageResult> sendResult = bufferedSqs.sendMessageAsync(request);
 
final ReceiveMessageRequest receiveRq = new ReceiveMessageRequest()
    .withMaxNumberOfMessages(1)
    .withQueueUrl(queueUrl);
final ReceiveMessageResult rx = bufferedSqs.receiveMessage(receiveRq);
```

### Configuration d'Amazon SQSBuffered AsyncClient


`AmazonSQSBufferedAsyncClient` est préconfiguré avec des paramètres qui fonctionnent dans la plupart des cas d'utilisation. Vous pouvez configurer davantage `AmazonSQSBufferedAsyncClient`, par exemple :

1. Créez une instance de la classe `QueueBufferConfig` avec les paramètres de configuration requis.

1. Fournissez l'instance au constructeur `AmazonSQSBufferedAsyncClient`.

```
// Create the basic Amazon SQS async client
final AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient();
 
final QueueBufferConfig config = new QueueBufferConfig()
    .withMaxInflightReceiveBatches(5)
    .withMaxDoneReceiveBatches(15);
 
// Create the buffered client
final AmazonSQSAsync bufferedSqs = new AmazonSQSBufferedAsyncClient(sqsAsync, config);
```


**QueueBufferConfig paramètres de configuration**  

| Paramètre | Valeur par défaut | Description | 
| --- | --- | --- | 
| longPoll | true |  Lorsque `longPoll` est défini sur `true`, `AmazonSQSBufferedAsyncClient` tente d'utiliser l'attente active de longue durée lors de la consommation des messages.  | 
| longPollWaitTimeoutSeconds | 20 s |  Durée maximale, en secondes, pendant laquelle un `ReceiveMessage` reste sur le serveur en attendant l'apparition de messages dans la file d'attente avant de renvoyer un résultat de réception vide.  Ce paramètre n'a pas d'impact lorsque l'attente active de longue durée est désactivée.   | 
| maxBatchOpenMs | 200 ms |  Durée maximale, en millisecondes, pendant laquelle un appel sortant attend d'autres appels du même type pour le traitement par lots. Plus le paramètre est élevé, moins il faut de lots pour effectuer la même quantité de travail (toutefois, le premier appel d'un lot doit passer plus de temps à attendre). Lorsque ce paramètre est défini sur `0`, les requêtes envoyées n'attendent pas d'autres requêtes, ce qui a pour effet de désactiver le traitement par lots.  | 
| maxBatchSize | 10 requêtes par lot |  Nombre maximal de messages traités dans un même lot dans le cadre d'une seule requête. Plus ce paramètre est élevé, moins le nombre de lots requis pour effectuer le même nombre de requêtes est élevé.  10 demandes par lots est la valeur maximale autorisée pour Amazon SQS.   | 
| maxBatchSizeBytes | 1 MiB |  Taille maximale d'un lot de messages, en octets, que le client essaie d'envoyer à Amazon SQS.  1 MiB est la valeur maximale autorisée pour Amazon SQS.   | 
| maxDoneReceiveBatches | 10 lots |  Nombre maximal de lots de réception récupérés au préalable par `AmazonSQSBufferedAsyncClient` et stockés côté client. Plus le paramètre est élevé, plus il est possible de satisfaire un grand nombre de demandes sans devoir appeler Amazon SQS (toutefois, plus le nombre de messages récupérés au préalable est important, plus ils restent longtemps dans la mémoire tampon, ce qui entraîne l'expiration de leur délai de visibilité).  `0`indique que la prélecture des messages est désactivée et que les messages sont consommés uniquement à la demande.   | 
| maxInflightOutboundBatches | 5 lots |  Nombre maximal de lots sortants actifs pouvant être traités en même temps. Plus ce paramètre est élevé, plus les lots sortants peuvent être envoyés rapidement (sous réserve d'autres quotas, tels que l'UC ou la bande passante) et plus le nombre de threads consommés par `AmazonSQSBufferedAsyncClient` est important.  | 
| maxInflightReceiveBatches | 10 lots |  Nombre maximum de lots de réception actifs pouvant être traités en même temps. Plus ce paramètre est élevé, plus le nombre de messages susceptibles d'être reçus est important (sous réserve d'autres quotas, tels que l'UC ou la bande passante) et plus le nombre de threads consommés par `AmazonSQSBufferedAsyncClient` est important.  `0`indique que la prélecture des messages est désactivée et que les messages sont consommés uniquement à la demande.   | 
| visibilityTimeoutSeconds | -1 |  Lorsqu'une valeur positive autre que zéro a été définie pour ce paramètre, le délai de visibilité définit ici prévaut sur celui de la file d'attente à partir de laquelle les messages sont consommés.  `-1` indique que le paramètre par défaut est sélectionné pour la file d'attente. Vous ne pouvez pas définir de délai de visibilité sur `0`.   | 

### AWS SDK pour Java 2.x


Pour le AWS SDK for Java 2.x, vous pouvez en créer un `SqsAsyncBatchManager` nouveau en vous basant sur l'exemple suivant :

```
// Create the basic Sqs Async Client
SqsAsyncClient sqs = SqsAsyncClient.builder() 
    .region(Region.US_EAST_1) 
    .build();

// Create the batch manager
SqsAsyncBatchManager sqsAsyncBatchManager = sqs.batchManager();
```

Après avoir créé le nouveau `SqsAsyncBatchManager`, utilisez-le pour envoyer plusieurs demandes à Amazon SQS (comme avec `SqsAsyncClient`), par exemple :

```
final String queueName = "MyAsyncBufferedQueue" + UUID.randomUUID();
final CreateQueueRequest request = CreateQueueRequest.builder().queueName(queueName).build();
final String queueUrl = sqs.createQueue(request).join().queueUrl();
System.out.println("Queue created: " + queueUrl);


// Send messages
CompletableFuture<SendMessageResponse> sendMessageFuture;
for (int i = 0; i < 10; i++) {
    final int index = i;
    sendMessageFuture = sqsAsyncBatchManager.sendMessage(
            r -> r.messageBody("Message " + index).queueUrl(queueUrl));
    SendMessageResponse response= sendMessageFuture.join();
    System.out.println("Message " + response.messageId() + " sent!");
}

// Receive messages with customized configurations
CompletableFuture<ReceiveMessageResponse> receiveResponseFuture = customizedBatchManager.receiveMessage(
        r -> r.queueUrl(queueUrl)
                .waitTimeSeconds(10)
                .visibilityTimeout(20)
                .maxNumberOfMessages(10)
);
System.out.println("You have received " + receiveResponseFuture.join().messages().size() + " messages in total.");

// Delete messages
DeleteQueueRequest deleteQueueRequest =  DeleteQueueRequest.builder().queueUrl(queueUrl).build();
int code = sqs.deleteQueue(deleteQueueRequest).join().sdkHttpResponse().statusCode();
System.out.println("Queue is deleted, with statusCode " + code);
```

### Configuration SqsAsyncBatchManager


`SqsAsyncBatchManager` est préconfiguré avec des paramètres qui fonctionnent dans la plupart des cas d'utilisation. Vous pouvez configurer davantage `SqsAsyncBatchManager`, par exemple :

Création d'une configuration personnalisée via `SqsAsyncBatchManager.Builder` :

```
SqsAsyncBatchManager customizedBatchManager = SqsAsyncBatchManager.builder() 
    .client(sqs)
    .scheduledExecutor(Executors.newScheduledThreadPool(5))
    .overrideConfiguration(b -> b 
        .maxBatchSize(10)
        .sendRequestFrequency(Duration.ofMillis(200))
        .receiveMessageMinWaitDuration(Duration.ofSeconds(10))
        .receiveMessageVisibilityTimeout(Duration.ofSeconds(20)) 
        .receiveMessageAttributeNames(Collections.singletonList("*"))
        .receiveMessageSystemAttributeNames(Collections.singletonList(MessageSystemAttributeName.ALL)))
    .build();
```


**Paramètres dans l’`BatchOverrideConfiguration`**  

| Paramètre | Valeur par défaut | Description | 
| --- | --- | --- | 
| maxBatchSize |  10 requêtes par lot  | Nombre maximal de messages traités dans un même lot dans le cadre d'une seule requête. Plus ce paramètre est élevé, moins le nombre de lots requis pour effectuer le même nombre de requêtes est élevé.  La valeur maximale autorisée pour Amazon SQS est de 10 demandes par lot.  | 
| sendRequestFrequency |  200 ms  | Durée maximale, en millisecondes, pendant laquelle un appel sortant attend d'autres appels du même type pour le traitement par lots. Plus le paramètre est élevé, moins il faut de lots pour effectuer la même quantité de travail (toutefois, le premier appel d'un lot doit passer plus de temps à attendre). Lorsque ce paramètre est défini sur `0`, les requêtes envoyées n'attendent pas d'autres requêtes, ce qui a pour effet de désactiver le traitement par lots. | 
| receiveMessageVisibilityTimeout |  -1  | Lorsqu'une valeur positive autre que zéro a été définie pour ce paramètre, le délai de visibilité définit ici prévaut sur celui de la file d'attente à partir de laquelle les messages sont consommés.   `1` indique que le paramètre par défaut est sélectionné pour la file d'attente. Vous ne pouvez pas définir de délai de visibilité sur `0`.   | 
| receiveMessageMinWaitDuration |  50 millisecondes  | Durée minimale (en millisecondes) pendant laquelle un `receiveMessage` appel attend que les messages disponibles soient récupérés. Plus le paramètre est élevé, moins il faut de lots pour exécuter le même nombre de demandes.  | 

# Augmenter le débit grâce à la mise à l'échelle horizontale et au traitement par lots d'actions avec Amazon SQS


Amazon SQS prend en charge la messagerie haut débit. Pour plus de détails sur les limites de débit, reportez-vous à[Quotas de messages Amazon SQS](quotas-messages.md).

Pour optimiser le débit :
+ [Faites évoluer](#horizontal-scaling) les producteurs et les consommateurs horizontalement en ajoutant plus d'instances de chacun d'eux.
+ Utilisez le [traitement par lots d'actions](#request-batching) pour envoyer ou recevoir plusieurs messages en une seule demande, réduisant ainsi la charge des appels d'API.

## Mise à l’échelle horizontale


Vous accédez à Amazon SQS via un protocole de demande-réponse HTTP. Par conséquent, la *latence de la demande* (l'intervalle de temps entre la création d'une requête et la réception de la réponse) limite le débit que vous pouvez obtenir d'un seul thread avec une connexion unique. Par exemple, si la latence d'un client basé sur Amazon EC2 envoyant des demandes vers Amazon SQS dans la même région avoisine les 20 ms, le débit maximal d'un thread unique sur une seule connexion est en moyenne de 50 TPS. 

La *mise à l'échelle horizontale* consiste à augmenter le nombre de producteurs de messages (émettant des requêtes `[SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)`) et de consommateurs de messages (émettant des requêtes `[ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)` et `[DeleteMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessage.html)`) afin d'augmenter le débit global de votre file d'attente. Vous pouvez mettre à l'échelle horizontalement de trois manières :
+ Augmenter le nombre de threads par client
+ Ajouter des clients
+ Augmentez le nombre de threads par client et ajouter d'autres clients

Lorsque vous ajoutez des clients, vous créez essentiellement un gain de débit linéaire pour votre file d'attente. Ainsi, si vous doublez le nombre de clients, vous obtiendrez deux fois plus de débit. 

## Traitement par lots des actions


Le *traitement par lots* effectue davantage de travail au cours de chaque aller-retour vers le service (par exemple, lorsque vous envoyez plusieurs messages avec une seule requête `SendMessageBatch`). Les actions par lots Amazon SQS sont `[SendMessageBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessageBatch.html)`, `[DeleteMessageBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessageBatch.html)` et `[ChangeMessageVisibilityBatch](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ChangeMessageVisibilityBatch.html)`. Pour profiter du traitement par lots sans modifier vos producteurs ou consommateurs, vous pouvez utiliser le [Client asynchrone en mémoire tampon Amazon SQS](sqs-client-side-buffering-request-batching.md).

**Note**  
Dans la mesure où `[ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)` peut traiter 10 messages simultanément, il n'y a pas d'action `ReceiveMessageBatch`.

Le traitement par lots répartit la latence de l'action sur plusieurs messages dans une demande par lots, au lieu d'accepter la totalité de la latence pour un seul message (par exemple, une demande `[SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)`). Dans la mesure où chaque échange avec le service inclut davantage de tâches à traiter, les requêtes par lots assurent une utilisation plus efficace des threads et connexions, ce qui améliore le débit.

Vous pouvez combiner la mise à l'échelle horizontale et le traitement par lots afin de proposer un débit avec moins de threads, de connexions et de requêtes que pour les requêtes de message individuelles. Vous pouvez utiliser des actions Amazon SQS par lots pour envoyer, recevoir ou supprimer jusqu'à 10 messages à la fois. Dans la mesure où Amazon SQS facture par demande, le traitement par lots peut vous aider à réduire considérablement vos coûts. 

Le traitement par lots peut ajouter un peu de complexité pour votre application (par exemple, votre application doit accumuler les messages avant de les envoyer, ou doit parfois attendre plus longtemps pour une réponse). Il reste toutefois efficace dans les cas suivants : 
+ Votre application génère de nombreux messages en peu de temps, si bien que le délai d'attente n'est jamais très long. 
+ Un consommateur de messages récupère les messages dans une file d'attente à sa discrétion, contrairement à un système où des producteurs de messages classiques ont besoin d'envoyer des messages en réponse à des événements qu'ils ne contrôlent pas. 

**Important**  
Une requête de traitement par lots peut aboutir même si des messages individuels inclus dans cette requête n'ont pas pu être traités. Après une requête de traitement par lot, recherchez toujours d'éventuelles erreurs concernant des messages individuels et, le cas échéant, relancez l'action.

## Exemple d'utilisation de Java pour les requêtes en une seule opération et par lots


### Conditions préalables


Ajoutez les packages `aws-java-sdk-sqs.jar`, `aws-java-sdk-ec2.jar` et `commons-logging.jar` au chemin de classe de votre version Java. L'exemple suivant illustre ces dépendances dans un fichier `pom.xml` de projet Maven.

```
<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-sqs</artifactId>
        <version>LATEST</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-ec2</artifactId>
        <version>LATEST</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>LATEST</version>
    </dependency>
</dependencies>
```

### SimpleProducerConsumer.java


L'exemple de code Java suivant implémente un schéma simple consommateur-producteur. Le thread principal génère un certain nombre de threads producteurs et consommateurs qui traitent des messages de 1 Ko pendant une durée spécifiée. Cet exemple inclut des producteurs et des consommateurs qui émettent des requêtes d'opérations simples, et d'autres qui créent des requêtes de traitement par lot.

```
/*
 * Copyright 2010-2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  https://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 *
 */

import com.amazonaws.AmazonClientException;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.amazonaws.services.sqs.model.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Start a specified number of producer and consumer threads, and produce-consume
 * for the least of the specified duration and 1 hour. Some messages can be left
 * in the queue because producers and consumers might not be in exact balance.
 */
public class SimpleProducerConsumer {

    // The maximum runtime of the program.
    private final static int MAX_RUNTIME_MINUTES = 60;
    private final static Log log = LogFactory.getLog(SimpleProducerConsumer.class);

    public static void main(String[] args) throws InterruptedException {

        final Scanner input = new Scanner(System.in);

        System.out.print("Enter the queue name: ");
        final String queueName = input.nextLine();

        System.out.print("Enter the number of producers: ");
        final int producerCount = input.nextInt();

        System.out.print("Enter the number of consumers: ");
        final int consumerCount = input.nextInt();

        System.out.print("Enter the number of messages per batch: ");
        final int batchSize = input.nextInt();

        System.out.print("Enter the message size in bytes: ");
        final int messageSizeByte = input.nextInt();

        System.out.print("Enter the run time in minutes: ");
        final int runTimeMinutes = input.nextInt();

        /*
         * Create a new instance of the builder with all defaults (credentials
         * and region) set automatically. For more information, see Creating
         * Service Clients in the AWS SDK for Java Developer Guide.
         */
        final ClientConfiguration clientConfiguration = new ClientConfiguration()
                .withMaxConnections(producerCount + consumerCount);

        final AmazonSQS sqsClient = AmazonSQSClientBuilder.standard()
                .withClientConfiguration(clientConfiguration)
                .build();

        final String queueUrl = sqsClient
                .getQueueUrl(new GetQueueUrlRequest(queueName)).getQueueUrl();

        // The flag used to stop producer, consumer, and monitor threads.
        final AtomicBoolean stop = new AtomicBoolean(false);

        // Start the producers.
        final AtomicInteger producedCount = new AtomicInteger();
        final Thread[] producers = new Thread[producerCount];
        for (int i = 0; i < producerCount; i++) {
            if (batchSize == 1) {
                producers[i] = new Producer(sqsClient, queueUrl, messageSizeByte,
                        producedCount, stop);
            } else {
                producers[i] = new BatchProducer(sqsClient, queueUrl, batchSize,
                        messageSizeByte, producedCount,
                        stop);
            }
            producers[i].start();
        }

        // Start the consumers.
        final AtomicInteger consumedCount = new AtomicInteger();
        final Thread[] consumers = new Thread[consumerCount];
        for (int i = 0; i < consumerCount; i++) {
            if (batchSize == 1) {
                consumers[i] = new Consumer(sqsClient, queueUrl, consumedCount,
                        stop);
            } else {
                consumers[i] = new BatchConsumer(sqsClient, queueUrl, batchSize,
                        consumedCount, stop);
            }
            consumers[i].start();
        }

        // Start the monitor thread.
        final Thread monitor = new Monitor(producedCount, consumedCount, stop);
        monitor.start();

        // Wait for the specified amount of time then stop.
        Thread.sleep(TimeUnit.MINUTES.toMillis(Math.min(runTimeMinutes,
                MAX_RUNTIME_MINUTES)));
        stop.set(true);

        // Join all threads.
        for (int i = 0; i < producerCount; i++) {
            producers[i].join();
        }

        for (int i = 0; i < consumerCount; i++) {
            consumers[i].join();
        }

        monitor.interrupt();
        monitor.join();
    }

    private static String makeRandomString(int sizeByte) {
        final byte[] bs = new byte[(int) Math.ceil(sizeByte * 5 / 8)];
        new Random().nextBytes(bs);
        bs[0] = (byte) ((bs[0] | 64) & 127);
        return new BigInteger(bs).toString(32);
    }

    /**
     * The producer thread uses {@code SendMessage}
     * to send messages until it is stopped.
     */
    private static class Producer extends Thread {
        final AmazonSQS sqsClient;
        final String queueUrl;
        final AtomicInteger producedCount;
        final AtomicBoolean stop;
        final String theMessage;

        Producer(AmazonSQS sqsQueueBuffer, String queueUrl, int messageSizeByte,
                 AtomicInteger producedCount, AtomicBoolean stop) {
            this.sqsClient = sqsQueueBuffer;
            this.queueUrl = queueUrl;
            this.producedCount = producedCount;
            this.stop = stop;
            this.theMessage = makeRandomString(messageSizeByte);
        }

        /*
         * The producedCount object tracks the number of messages produced by
         * all producer threads. If there is an error, the program exits the
         * run() method.
         */
        public void run() {
            try {
                while (!stop.get()) {
                    sqsClient.sendMessage(new SendMessageRequest(queueUrl,
                            theMessage));
                    producedCount.incrementAndGet();
                }
            } catch (AmazonClientException e) {
                /*
                 * By default, AmazonSQSClient retries calls 3 times before
                 * failing. If this unlikely condition occurs, stop.
                 */
                log.error("Producer: " + e.getMessage());
                System.exit(1);
            }
        }
    }

    /**
     * The producer thread uses {@code SendMessageBatch}
     * to send messages until it is stopped.
     */
    private static class BatchProducer extends Thread {
        final AmazonSQS sqsClient;
        final String queueUrl;
        final int batchSize;
        final AtomicInteger producedCount;
        final AtomicBoolean stop;
        final String theMessage;

        BatchProducer(AmazonSQS sqsQueueBuffer, String queueUrl, int batchSize,
                      int messageSizeByte, AtomicInteger producedCount,
                      AtomicBoolean stop) {
            this.sqsClient = sqsQueueBuffer;
            this.queueUrl = queueUrl;
            this.batchSize = batchSize;
            this.producedCount = producedCount;
            this.stop = stop;
            this.theMessage = makeRandomString(messageSizeByte);
        }

        public void run() {
            try {
                while (!stop.get()) {
                    final SendMessageBatchRequest batchRequest =
                            new SendMessageBatchRequest().withQueueUrl(queueUrl);

                    final List<SendMessageBatchRequestEntry> entries =
                            new ArrayList<SendMessageBatchRequestEntry>();
                    for (int i = 0; i < batchSize; i++)
                        entries.add(new SendMessageBatchRequestEntry()
                                .withId(Integer.toString(i))
                                .withMessageBody(theMessage));
                    batchRequest.setEntries(entries);

                    final SendMessageBatchResult batchResult =
                            sqsClient.sendMessageBatch(batchRequest);
                    producedCount.addAndGet(batchResult.getSuccessful().size());

                    /*
                     * Because SendMessageBatch can return successfully, but
                     * individual batch items fail, retry the failed batch items.
                     */
                    if (!batchResult.getFailed().isEmpty()) {
                        log.warn("Producer: retrying sending "
                                + batchResult.getFailed().size() + " messages");
                        for (int i = 0, n = batchResult.getFailed().size();
                             i < n; i++) {
                            sqsClient.sendMessage(new
                                    SendMessageRequest(queueUrl, theMessage));
                            producedCount.incrementAndGet();
                        }
                    }
                }
            } catch (AmazonClientException e) {
                /*
                 * By default, AmazonSQSClient retries calls 3 times before
                 * failing. If this unlikely condition occurs, stop.
                 */
                log.error("BatchProducer: " + e.getMessage());
                System.exit(1);
            }
        }
    }

    /**
     * The consumer thread uses {@code ReceiveMessage} and {@code DeleteMessage}
     * to consume messages until it is stopped.
     */
    private static class Consumer extends Thread {
        final AmazonSQS sqsClient;
        final String queueUrl;
        final AtomicInteger consumedCount;
        final AtomicBoolean stop;

        Consumer(AmazonSQS sqsClient, String queueUrl, AtomicInteger consumedCount,
                 AtomicBoolean stop) {
            this.sqsClient = sqsClient;
            this.queueUrl = queueUrl;
            this.consumedCount = consumedCount;
            this.stop = stop;
        }

        /*
         * Each consumer thread receives and deletes messages until the main
         * thread stops the consumer thread. The consumedCount object tracks the
         * number of messages that are consumed by all consumer threads, and the
         * count is logged periodically.
         */
        public void run() {
            try {
                while (!stop.get()) {
                    try {
                        final ReceiveMessageResult result = sqsClient
                                .receiveMessage(new
                                        ReceiveMessageRequest(queueUrl));

                        if (!result.getMessages().isEmpty()) {
                            final Message m = result.getMessages().get(0);
                            sqsClient.deleteMessage(new
                                    DeleteMessageRequest(queueUrl,
                                    m.getReceiptHandle()));
                            consumedCount.incrementAndGet();
                        }
                    } catch (AmazonClientException e) {
                        log.error(e.getMessage());
                    }
                }
            } catch (AmazonClientException e) {
                /*
                 * By default, AmazonSQSClient retries calls 3 times before
                 * failing. If this unlikely condition occurs, stop.
                 */
                log.error("Consumer: " + e.getMessage());
                System.exit(1);
            }
        }
    }

    /**
     * The consumer thread uses {@code ReceiveMessage} and {@code
     * DeleteMessageBatch} to consume messages until it is stopped.
     */
    private static class BatchConsumer extends Thread {
        final AmazonSQS sqsClient;
        final String queueUrl;
        final int batchSize;
        final AtomicInteger consumedCount;
        final AtomicBoolean stop;

        BatchConsumer(AmazonSQS sqsClient, String queueUrl, int batchSize,
                      AtomicInteger consumedCount, AtomicBoolean stop) {
            this.sqsClient = sqsClient;
            this.queueUrl = queueUrl;
            this.batchSize = batchSize;
            this.consumedCount = consumedCount;
            this.stop = stop;
        }

        public void run() {
            try {
                while (!stop.get()) {
                    final ReceiveMessageResult result = sqsClient
                            .receiveMessage(new ReceiveMessageRequest(queueUrl)
                                    .withMaxNumberOfMessages(batchSize));

                    if (!result.getMessages().isEmpty()) {
                        final List<Message> messages = result.getMessages();
                        final DeleteMessageBatchRequest batchRequest =
                                new DeleteMessageBatchRequest()
                                        .withQueueUrl(queueUrl);

                        final List<DeleteMessageBatchRequestEntry> entries =
                                new ArrayList<DeleteMessageBatchRequestEntry>();
                        for (int i = 0, n = messages.size(); i < n; i++)
                            entries.add(new DeleteMessageBatchRequestEntry()
                                    .withId(Integer.toString(i))
                                    .withReceiptHandle(messages.get(i)
                                            .getReceiptHandle()));
                        batchRequest.setEntries(entries);

                        final DeleteMessageBatchResult batchResult = sqsClient
                                .deleteMessageBatch(batchRequest);
                        consumedCount.addAndGet(batchResult.getSuccessful().size());

                        /*
                         * Because DeleteMessageBatch can return successfully,
                         * but individual batch items fail, retry the failed
                         * batch items.
                         */
                        if (!batchResult.getFailed().isEmpty()) {
                            final int n = batchResult.getFailed().size();
                            log.warn("Producer: retrying deleting " + n
                                    + " messages");
                            for (BatchResultErrorEntry e : batchResult
                                    .getFailed()) {

                                sqsClient.deleteMessage(
                                        new DeleteMessageRequest(queueUrl,
                                                messages.get(Integer
                                                        .parseInt(e.getId()))
                                                        .getReceiptHandle()));

                                consumedCount.incrementAndGet();
                            }
                        }
                    }
                }
            } catch (AmazonClientException e) {
                /*
                 * By default, AmazonSQSClient retries calls 3 times before
                 * failing. If this unlikely condition occurs, stop.
                 */
                log.error("BatchConsumer: " + e.getMessage());
                System.exit(1);
            }
        }
    }

    /**
     * This thread prints every second the number of messages produced and
     * consumed so far.
     */
    private static class Monitor extends Thread {
        private final AtomicInteger producedCount;
        private final AtomicInteger consumedCount;
        private final AtomicBoolean stop;

        Monitor(AtomicInteger producedCount, AtomicInteger consumedCount,
                AtomicBoolean stop) {
            this.producedCount = producedCount;
            this.consumedCount = consumedCount;
            this.stop = stop;
        }

        public void run() {
            try {
                while (!stop.get()) {
                    Thread.sleep(1000);
                    log.info("produced messages = " + producedCount.get()
                            + ", consumed messages = " + consumedCount.get());
                }
            } catch (InterruptedException e) {
                // Allow the thread to exit.
            }
        }
    }
}
```

### Surveillance des métriques de volume pour l'exemple exécuté


Amazon SQS génère automatiquement des métriques de volume pour les messages envoyés, reçus et supprimés. Vous pouvez accéder à ces métriques et à d'autres via l'onglet **Surveillance** de votre file d'attente ou dans la [console CloudWatch ](https://console.aws.amazon.com/cloudwatch/home).

**Note**  
Après le démarrage de la file d'attente, il faut patienter jusqu'à 15 minutes pour que ces métriques soient disponibles.

# Utilisation d'Amazon SQS avec un SDK AWS
Travailler avec AWS SDKs

AWS des kits de développement logiciel (SDKs) sont disponibles pour de nombreux langages de programmation courants. Chaque SDK fournit une API, des exemples de code et de la documentation qui facilitent la création d’applications par les développeurs dans leur langage préféré.


| Documentation SDK | Exemples de code | 
| --- | --- | 
| [AWS SDK pour C\$1\$1](https://docs.aws.amazon.com/sdk-for-cpp) | [AWS SDK pour C\$1\$1 exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp) | 
| [AWS CLI](https://docs.aws.amazon.com/cli) | [AWS CLI exemples de code](https://docs.aws.amazon.com/code-library/latest/ug/cli_2_code_examples.html) | 
| [AWS SDK pour Go](https://docs.aws.amazon.com/sdk-for-go) | [AWS SDK pour Go exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/gov2) | 
| [AWS SDK pour Java](https://docs.aws.amazon.com/sdk-for-java) | [AWS SDK pour Java exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2) | 
| [AWS SDK pour JavaScript](https://docs.aws.amazon.com/sdk-for-javascript) | [AWS SDK pour JavaScript exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3) | 
| [AWS SDK pour Kotlin](https://docs.aws.amazon.com/sdk-for-kotlin) | [AWS SDK pour Kotlin exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin) | 
| [AWS SDK pour .NET](https://docs.aws.amazon.com/sdk-for-net) | [AWS SDK pour .NET exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3) | 
| [AWS SDK pour PHP](https://docs.aws.amazon.com/sdk-for-php) | [AWS SDK pour PHP exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php) | 
| [Outils AWS pour PowerShell](https://docs.aws.amazon.com/powershell) | [Outils AWS pour PowerShell exemples de code](https://docs.aws.amazon.com/code-library/latest/ug/powershell_5_code_examples.html) | 
| [AWS SDK pour Python (Boto3)](https://docs.aws.amazon.com/pythonsdk) | [AWS SDK pour Python (Boto3) exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python) | 
| [AWS SDK pour Ruby](https://docs.aws.amazon.com/sdk-for-ruby) | [AWS SDK pour Ruby exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/ruby) | 
| [AWS SDK pour Rust](https://docs.aws.amazon.com/sdk-for-rust) | [AWS SDK pour Rust exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1) | 
| [AWS SDK pour SAP ABAP](https://docs.aws.amazon.com/sdk-for-sapabap) | [AWS SDK pour SAP ABAP exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/sap-abap) | 
| [AWS SDK pour Swift](https://docs.aws.amazon.com/sdk-for-swift) | [AWS SDK pour Swift exemples de code](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/swift) | 

**Exemple de disponibilité**  
Vous n’avez pas trouvé ce dont vous avez besoin ? Demandez un exemple de code en utilisant le lien **Provide feedback (Fournir un commentaire)** en bas de cette page.