Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Black Friday: -25€ dès 75€ sur les livres en ligne, vidéos... avec le code BWEEK25. J'en profite !
  1. Livres et vidéos
  2. AWS Lambda
  3. Le service SQS (Simple Queue Service)
Extrait - AWS Lambda Développez des micro-services en Java sur la plateforme serverless d'Amazon
Extraits du livre
AWS Lambda Développez des micro-services en Java sur la plateforme serverless d'Amazon
1 avis
Revenir à la page d'achat du livre

Le service SQS (Simple Queue Service)

Introduction

SQS est le service de messaging d’AWS. Il s’agit d’un service qui se veut « simple », comme son nom l’indique. Il est basé sur la notion de file d’attente ou queue, dans laquelle on peut stocker et récupérer, de manière plus ou moins ordonnée, des messages. Tout fonctionne selon une dynamique fournisseur/consommateur de messages, où le premier produit des messages et les stocke dans des files d’attente et le dernier les consomme.

SQS est un service distribué, à tolérance des pannes, qui permet à des fournisseurs/consommateurs multiples d’interagir par l’intermédiaire des files d’attente. Les messages échangés sont caractérisés par un cycle de vie standard, avec une période de rétention et une date d’expiration, au-delà desquelles ils sont supprimés. L’interaction qui a lieu entre les fournisseurs et les consommateurs de messages est complètement découplée, dans le sens où ils ne se connaissent pas, ce qui évite la création d’adhérences entre les composants.

Fournisseurs et consommateurs de messages SQS

Fournisseurs et consommateurs de messages SQS

Le service SQS propose deux types de files d’attente : standard et FIFO (First In First Out). Bien que très similaires, ces deux types de files d’attente présentent...

Files d’attente SQS standard

Une des premières particularités des files d’attente standard est le fait qu’elles ne garantissent pas l’ordre selon lequel les messages sont stockés et, par conséquent, consommés. Bien que la loi du best effort s’y applique et que, par conséquent, l’ordre de l’arrivée des messages est dans la plupart des cas respecté, cela n’est pas garanti et il peut arriver que des messages soient traités en désordre. Ainsi, un consommateur de messages d’une file d’attente SQS standard ne peut pas présumer que l’ordre selon lequel il consomme les messages est bien celui dans lequel ils ont été initialement reçus.

De plus, l’unicité des messages dans la file n’est pas garantie non plus et, par conséquent, il peut arriver occasionnellement que plus d’une copie du même message soit délivrée à ses consommateurs. Ces deux particularités font que la fiabilité des files d’attente SQS est limitée, mais leur utilisation reste très intéressante dans des cas de figure moins contraignants, car elles proposent des rapports coûts/performances attractifs.

Ceci d’autant plus que les files d’attente standard peuvent supporter un nombre virtuellement illimité de transactions par seconde. Elles...

Files d’attente SQS FIFO

Ce type de file d’attente SQS a été spécialement conçu pour des cas d’utilisation dans lesquels garantir la consommation des messages dans l’ordre de leur arrivée est critique. Car les files d’attente SQS FIFO garantissent cet ordre. De plus, elles garantissent également l’unicité des messages, rendant ainsi impossible l’existence de doublons.

Les SQS FIFO se caractérisent par une fiabilité supérieure, comparées à leurs homologues standards. En revanche, contrairement à ces dernières, elles ne sont pas disponibles dans toutes les régions et sont limitées à maximum 300 transactions par seconde. Et si on rajoute le fait qu’elles ne sont pas supportées par tous les services AWS et que, s’agissant du service Lambda, leur support est seulement limité à un concept connu sous le nom de DLQ (Dead Letters Queues), qu’on va analyser dans un instant, alors il nous apparaît clairement que leur utilisation dans notre contexte spécifique n’est pas spécialement utile.

Le tableau ci-dessous permet de se repérer quant aux cas d’utilisation des deux types de files d’attente proposées par l’infrastructure AWS :

Critère

SQS FIFO

SQS Standard

Performances

300 TPS (Transaction Per Second)

Virtuellement...

La production/consommation des messages SQS

La manipulation d’une file d’attente SQS standard, qui inclut des opérations comme la création, la production/consommation/suppression des messages, etc., peut se faire très simplement avec AWS CLI, comme suit :

nicolas@BEL20:~$ aws sqs create-queue --queue-name send-money-queue 
{ 
    "QueueUrl": "https://sqs.eu-west-3.amazonaws.com/459436678662/
send-money-queue" 
} 
nicolas@BEL20:~$ aws sqs get-queue-attributes --queue-url 
https://sqs.eu-west-3.amazonaws.com/459436678662/send-money-queue 
nicolas@BEL20:~$ aws sqs get-queue-attributes --queue-url 
https://sqs.eu-west-3.amazonaws.com/459436678662/send-money-queue 
--attribute-name 
ApproximateNumberOfMessages 
{ 
    "Attributes": { 
        "ApproximateNumberOfMessages": "0" 
    } 
} 
nicolas@BEL20:~$ aws sqs get-queue-attributes --queue-url 
https://sqs.eu-west-3.amazonaws.com/459436678662/send-money-queue 
--attribute-name All 
{ 
    "Attributes": { 
        "QueueArn": "arn:aws:sqs:eu-west-3:459436678662:send-money-queue", 
        "ApproximateNumberOfMessages": "0", 
        "ApproximateNumberOfMessagesNotVisible": "0", 
        "ApproximateNumberOfMessagesDelayed": "0", 
        "CreatedTimestamp": "1597749946", ...

Le scénario de test

Lorsque nous nous sommes occupés du service API Gateway, au chapitre Le développement d’API Serverless, nous avions fourni une implémentation minimaliste des fonctions Lambda auxquelles les points d’entrée de notre API étaient connectés. Il est temps maintenant que nous complétions cette implémentation.

Ainsi, nous allons remplacer l’implémentation actuelle qui ne fait qu’une simple journalisation des messages, avec une autre qui publie, dans une file d’attente dédiée, chaque nouvel ordre de virement bancaire. Ceci afin que cet ordre puisse être récupéré par le service qui effectue le processus de transfert a proprement dit, service qui est en général un service externe à l’organisation. Et s’agissant d’une opération non déterministe, dont on ne peut pas présumer la durée, on ne peut pas non plus, par conséquent, ni anticiper ni attendre le résultat. D’où la nécessité d’un traitement asynchrone et complètement découplé, consistant à déposer les ordres de virements dans une file d’attente, pour qu’ils soient récupérés et traités en temps voulu.

Pour mémoire, notre scénario général est reproduit ci-dessous.

Le scénario général

Le scénario général

Voilà maintenant le scénario qui sera implémenté lors de ce chapitre :

Le scénario courant

Le scénario courant

Et voici la mise à jour des étapes de notre scénario courant :

  • Un fichier XML contenant des ordres de virements bancaires sera transféré dans un compartiment S3 par un script AWS CLI.

  • Ceci provoquera le déclenchement d’une fonction Lambda, définie de manière à attendre l’événement associé à la réception du fichier par le compartiment S3.

  • Cette fonction Lambda va effectuer le unmarshalling du document XML reçu dans un objet de classe MoneyTransfers, en conformité avec la grammaire XSD définie dans le fichier money-xfer.xsd.

  • Un objet de classe MoneyTransfers étant en fait une collection d’objets de classe MoneyTransfer, notre fonction Lambda va extraire chaque...

Exécution et test

Pour déployer ce nouveau projet, on utilise le même script deploy.sh. Un coup d’œil rapide à ce script nous montre quelques modifications mineures par rapport à sa version précédente.

#!/bin/bash 
RANDOM=$$ 
BUCKET_NAME=bucketname-$RANDOM 
STAGE_NAME=dev 
AWS_REGION=$(aws configure list | grep region | awk '{print $2}') 
aws s3 mb s3://$BUCKET_NAME 
echo $BUCKET_NAME > bucket-name.txt 
aws s3 cp openapi.yaml s3://$BUCKET_NAME/openapi.yaml 
sam deploy --s3-bucket $BUCKET_NAME --stack-name chapter6-stack 
--capabilities  
CAPABILITY_IAM --parameter-overrides BucketName=$BUCKET_NAME 
aws cloudformation wait stack-create-complete --stack-name chapter6-stack 
API_ID=$(aws apigateway get-rest-apis --query "items[?name==
'send-money-api'].id" --output text) 
aws apigateway create-deployment --rest-api-id $API_ID 
--stage-name $STAGE_NAME 
>/dev/null 2>&1 
echo "Your API with ID $API_ID is deployed and ready to be tested at 
https://$API_ID.execute-api.$AWS_REGION.amazonaws.com/$STAGE_NAME" 

 Exécutez la commande suivante pour construire une nouvelle version de l’archive à déployer :

nicolas@BEL20:~/AWSLambda/projects/aws-lambda/chapter6$ mvn clean install 
[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------- 
[INFO] Reactor Build Order: 
[INFO]  
[INFO] Money Transfer :: The master POM module                       [pom] 
[INFO] Money Transfer :: The domain model module                     [jar] 
[INFO] Money Transfer :: The Lambda module                           [jar] 
[INFO]  
[INFO] -----------< fr.simplex-software.aws.lambda:chapter6 >------------- 
[INFO] Building Money Transfer :: The master POM module 1.0-SNAPSHOT [1/3] 
[INFO] -----------------------------[ pom ]-------------------------------- 
[INFO]  
[INFO] ---- maven-clean-plugin:3.1.0:clean...