đ§ AWS SQS â Architecture, OpĂ©rations & Bonnes Pratiques
Standard & FIFO queues, DLQ, visibilité, intégrations SNS/Lambda, sécurité, coûts, monitoring & troubleshooting.
Vue dâensemble
Concepts, Standard vs FIFO, vocabulaire.
StandardFIFODLQArchitecture
Visibilité, redelivery, DLQ, dédup.
VisibilityRedriveInstallation AWS
Console, CLI, CFN, Terraform, IAM.
IAMKMSProducteurs
Python (boto3), batch, idempotence.
SendBatchConsommateurs
Workers Python, Lambda, backoff.
ReceiveVisibilityFonctionnalités
DLQ, timers, delay, SSE-KMS.
DelayKMSIntégrations
SNS fanout, Lambda, Step Functions.
SNSLambdaPerformance & Coûts
Throughput, quotas, optimisations.
BatchPricingMonitoring
CloudWatch, alarmes, métriques.
CWAlarmsBest Practices
Prod/SRE, sécurité, gouvernance.
SRESecurityTroubleshooting
Poison msg, redeliver, throttling.
PoisonThrottlingCas dâusage
Web, IoT, ETL, microservices.
AsyncBufferRéférences
Docs officielles & guides.
AWS DocsDéfinition
SQS est une file de messages entiÚrement managée par AWS. Elle permet la communication asynchrone entre systÚmes distribués sans nécessiter de broker ou serveur à maintenir.
- DurabilitĂ© multiâAZ : chaque message est stockĂ© de maniĂšre redondĂ©e.
- Atâleastâonce delivery : un message peut ĂȘtre redĂ©livrĂ© â idempotence cĂŽtĂ© consommateur.
- Découplage : permet à des microservices de communiquer sans se connaßtre.
Objectifs
- Ăviter la saturation de services en aval (buffering).
- Rendre les systÚmes élastiques (scaling horizontal).
- Absorber les pics de charge et défaillances temporaires.
Comparatif détaillé
| CritĂšre | Standard | FIFO | Utilisation |
|---|---|---|---|
| Ordre | Best effort | Strict par MessageGroupId | Logs, Tracking vs Paiements, Commandes |
| DĂ©bit | ~illimitĂ© | 300 â 3000 msg/s | Bulk processing vs Transactions synchronisĂ©es |
| DĂ©duplication | Non natif | DeduplicationId (5 min window) | Ăviter doublons mĂ©tiers |
| Coût | Moins cher | LégÚrement plus cher | Comparer au workload réel |
Visibility Timeout
AprĂšs rĂ©ception, un message devient invisible pour la durĂ©e du VisibilityTimeout. Si non supprimĂ© â redelivery.
# Recommandation VisibilityTimeout = P95 durée de traitement + marge
Message Retention
DurĂ©e de conservation : 1 minute â 14 jours. Plus haut â coĂ»ts + risque backlog.
Producteur â SendMessage / Batch File SQS (Standard ou FIFO) â ReceiveMessage (long polling 20s) Worker / Lambda â DeleteMessage (sinon redelivery) DLQ si maxReceiveCount atteint
Cas dâusage concrets
- Webhooks â SQS â Workers â DB (garantie que rien nâest perdu).
- Eâcommerce : commandes FIFO groupĂ©es par
customer_id. - Analytics : ingestion dâĂ©vĂ©nements avant traitement batch ou Lambda.
- IoT : buffering des capteurs pour Ă©viter lâĂ©crasement en cas de pic.
ReceiveMessage(WaitTime=20, Max=10, Visibility=60)
ââ Process (â€60s) â DeleteMessage
ââ sinon ChangeMessageVisibility(+60) ou redelivery
- VisibilityTimeout â„ P95 de traitement + marge.
- In-flight = messages non visibles (metric:
ApproximateNumberOfMessagesNotVisible). - Backpressure cÎté workers: limiter la concurrence si la DLQ monte.
RedrivePolicy = { deadLetterTargetArn: DLQ_ARN, maxReceiveCount: 5 }- DLQ par domaine (ex:
orders-dlq,billing-dlq). - Pipeline de replay contrÎlé (filtrer poison vs transitoire).
- Tagger les messages (attrs) avec reason, tenant, traceId.
- MessageGroupId = file logique dâordre strict (un consommateur par groupe).
- MessageDeduplicationId fenĂȘtre 5 min (ou ContentBasedDeduplication).
- Stratégies de choix du group id :
customer_id,account_id,aggregate_id.
[Producer] --Send/Batch--> [SQS] --Receive(10)--> [Workers k8s]
|--DLQ (maxReceiveCount)
LongPoll 20s â coĂ»ts, â throughput | FIFO: GroupId â ordre strict- Aller sur AWS Console â SQS â Create queue.
- Choisir Standard ou FIFO (cocher FIFO et Content-based dedup si besoin).
- Configurer VisibilityTimeout, MessageRetention, DLQ, SSE.
- CrĂ©er une policy dâaccĂšs IAM minimale pour producteurs/consommateurs.
aws sqs create-queue --queue-name orders --attributes VisibilityTimeout=45,MessageRetentionPeriod=604800
aws sqs create-queue --queue-name orders.fifo --attributes FifoQueue=true,ContentBasedDeduplication=true
aws sqs set-queue-attributes --queue-url URL --attributes RedrivePolicy='{"deadLetterTargetArn":"DLQ_ARN","maxReceiveCount":"5"}'
Resources:
OrdersQ:
Type: AWS::SQS::Queue
Properties:
QueueName: orders
VisibilityTimeout: 45
MessageRetentionPeriod: 604800
OrdersDLQ:
Type: AWS::SQS::Queue
Properties:
QueueName: orders-dlq
MessageRetentionPeriod: 1209600
OrdersRedrive:
Type: AWS::SQS::QueuePolicy
Properties:
Queues: [!Ref OrdersQ]
PolicyDocument:
Statement:
- Effect: Allow
Action: ["sqs:SendMessage"]
Resource: !GetAtt OrdersQ.Arn
Principal: { "AWS": "*" }
resource "aws_sqs_queue" "orders" {
name = "orders"
visibility_timeout_seconds= 45
message_retention_seconds = 604800
redrive_policy = jsonencode({
deadLetterTargetArn = aws_sqs_queue.orders_dlq.arn
maxReceiveCount = 5
})
}
resource "aws_sqs_queue" "orders_dlq" { name = "orders-dlq" }
{
"Version":"2012-10-17",
"Statement":[{
"Effect":"Allow",
"Action":["sqs:SendMessage","sqs:ReceiveMessage","sqs:DeleteMessage","sqs:ChangeMessageVisibility"],
"Resource":"arn:aws:sqs:eu-west-3:123456789012:orders"
}]
}
# SSEâKMS â Autoriser kms:Decrypt aux rĂŽles producer/consumer
CrĂ©er un VPC Interface Endpoint pour com.amazonaws.${region}.sqs : trafic privĂ©, moins de latence et pas dâegress Internet.
import boto3, json
sqs=boto3.client('sqs', region_name='eu-west-3')
URL='https://sqs.eu-west-3.amazonaws.com/123456789012/orders'
body={"order_id":"o-123","total":42.9}
sqs.send_message(QueueUrl=URL, MessageBody=json.dumps(body), MessageAttributes={
'tenant':{'DataType':'String','StringValue':'eu'},
'traceId':{'DataType':'String','StringValue':'abc-123'}
})
entries=[{"Id":str(i),"MessageBody":json.dumps({"order_id":i})} for i in range(10)]
sqs.send_message_batch(QueueUrl=URL, Entries=entries)
Toujours vérifier Failed dans la réponse et réémettre uniquement les entrées en échec.
# FIFO: idempotence â group & dedup
def send_fifo(order):
return sqs.send_message(QueueUrl=URL_FIFO,
MessageBody=json.dumps(order),
MessageGroupId=str(order['customer_id']),
MessageDeduplicationId=hashlib.sha256(json.dumps(order,sort_keys=True).encode()).hexdigest())
En Standard, gĂ©rer lâidempotence cĂŽtĂ© consommateur avec un store (Redis/DB) de messageId ou clĂ© mĂ©tier.
from pydantic import BaseModel
class Order(BaseModel):
order_id:str; total:float; items:list
# valider avant envoi
Order(**body)
while True:
resp=sqs.receive_message(QueueUrl=URL,WaitTimeSeconds=20,MaxNumberOfMessages=10,VisibilityTimeout=60)
for m in resp.get('Messages',[]):
trace=m.get('MessageAttributes',{}).get('traceId',{}).get('StringValue')
try:
handle(json.loads(m['Body']), trace)
sqs.delete_message(QueueUrl=URL, ReceiptHandle=m['ReceiptHandle'])
except Retryable:
sqs.change_message_visibility(QueueUrl=URL, ReceiptHandle=m['ReceiptHandle'], VisibilityTimeout=120)
except Exception as e:
log_error(e, trace)
# laisser aller en DLQ aprĂšs maxReceiveCount
- VisibilityTimeout = P95 traitement + marge; appeler
change_message_visibilitypour jobs longs. - Batch delete pour réduire le coût : regrouper les
ReceiptHandle. - Jitter sur les retries pour éviter les hérissements (thundering herd).
# Mapping Lambda
batchSize=10; maximumBatchingWindow=5s; visibilityTimeout=6x lambdaTimeout
# Gestion des échecs: Destinations ou DLQ SQS
import redis
r=redis.Redis(host='redis')
def already_processed(key:str)->bool:
return r.setnx(f"done:{key}", 1)==0
# Dans handle()
key=payload['order_id']
if already_processed(key):
return # idempotent
Delay & Timers
sqs.send_message(QueueUrl=url, MessageBody='..', DelaySeconds=900) # †15 min # ou par dĂ©faut de queue: DelaySeconds (0â900)
Pour scheduler >15 min : utiliser EventBridge + SQS.
Extended Client (payload >256KB)
# Java: amazon-sqs-java-extended-client-lib # Stocke le corps sur S3 et place un pointeur dans SQS
SSE/KMS
Activer SSEâKMS et donner au rĂŽle lâaccĂšs kms:Decrypt.
SNS topic -> (subscriptions) -> SQS queues A,B,C # Politique SQS pour autoriser SNS Ă publier
# Event source mapping batchSize=10, maximumBatchingWindow=5s, visibilityTimeout=6x timeout lambda # Gérer les échecs: on-failure DLQ (SQS) ou Destinations
Orchestration de workflows : tùches asynchrones avec attente sur files, ré-essais et branches.
| Sujet | Standard | FIFO |
|---|---|---|
| DĂ©bit | IllimitĂ© | ~300 msg/s/shard â ~3k avec batch |
| Batch | â€10 | â€10 |
| Taille | 256 KB (au-delĂ : Extended Client + S3) | |
# Coût approximatif (simplifié)
Cost â (Send + Receive + Delete + PayloadExtensions) * PricePerRequest
â RĂ©duire en:
- activant le LongPolling (WaitTime=20)
- utilisant send/receive/delete en batch (10)
- évitant les messages vides (polling inutile)
- Maximiser WaitTimeSeconds (20s) â moins dâappels facturĂ©s.
- Regrouper les DeleteMessageBatch.
- Mettre une TTL réaliste et surveiller OldestMessageAge.
- PrĂ©fĂ©rer FIFO uniquement si lâordre strict est impĂ©ratif.
# Producteur â buffer en mĂ©moire â flush toutes les 50ms ou 10 msgs
# Consommateur â receive(10) â traitement parallĂšle (pool) â delete_batch
Métriques clés
| Métrique | Signification | Seuils |
|---|---|---|
| ApproximateNumberOfMessagesVisible | Backlog | > seuil SLO |
| ApproximateNumberOfMessagesNotVisible | Inâflight | Suivre tendance |
| ApproximateAgeOfOldestMessage | Ăge max | > X minutes â alarme |
| NumberOfMessages* | Débit | Baseline/Anomalies |
Alarmes types
OldestMessageAge > 300s (critique)
Visible > N (backlog) pendant 5 min
Errors 5xx SDK > 0 â retry/backoff
Corréler avec logs applicatifs (traceId) et APM (X-Ray, Datadog, OpenTelemetry).
- Augmenter la concurrence des workers (auto-scaling).
- Optimiser lot
MaxNumberOfMessages=10+DeleteBatch. - VĂ©rifier dĂ©pendances aval (DB/API) â backpressure et circuit-breaker.
- Configurer DLQ (
maxReceiveCount=3..5). - Ajouter reason/stack dans attributes; requĂȘter DLQ pour analytics.
- Replay outillé (scripts) pour les cas réparables.
- Implémenter retry avec backoff + jitter cÎté SDK.
- Limiter la QPS (token bucket) cÎté producteur.
- Utiliser VPC Endpoint pour réduire la latence réseau.
- Activer LongPolling 20s ; supprimer le polling « vide ».
- Regrouper via batch; surveiller NumberOfEmptyReceives si dispo.
- Réduire les tailles/attributs inutiles; externaliser gros payloads (S3 Extended).
Web & Microservices
- File dâattente dâemails/SMS, webhooks, gĂ©nĂ©ration PDF.
- Limitation de débit (buffer) vers API tierces.
IoT
- RemontĂ©e tĂ©lĂ©mĂ©trie via IoT Core â SNS â SQS.
Data/ETL
- Déclenchements batch (Lambda) ou pipelines Step Functions.
- Réconciliation : FIFO + Groupes par entité.
Eâcommerce/Banking
- Traitements commande, antiâduplication par DeduplicationId.
Production
- Toujours activer DLQ et playbooks de replay.
- Long polling 20s et batch(10) partout.
- Observabilité : métriques + logs corrélés (traceId).
- Idempotence stricte cÎté consommateurs (clé métier).
Sécurité & Gouvernance
- IAM leastâprivilege, SSEâKMS, VPC Endpoints.
- Nomenclature :
env-domain-queue, tags{env,team,owner,costcenter}. - Lifecycle : TTL/retention, politiques de purge, audits périodiques.
- AWS SQS Developer Guide & API Reference.
- AWS Blogs : SQS best practices, Lambda + SQS event source.
- SDKÂ : boto3 (Python), AWS SDK v3 (Node), Java v2.
- Infrastructure as Code : CloudFormation & Terraform.
- Extended Client (S3) â GitHub amazon-sqs-java-extended-client-lib (concept applicable).
CLI
aws sqs purge-queue --queue-url URL aws sqs get-queue-attributes --queue-url URL --attribute-names All aws sqs receive-message --queue-url URL --wait-time-seconds 20 --max-number-of-messages 10
Python â helpers
def delete_batch(url, handles):
entries=[{"Id":str(i),"ReceiptHandle":h} for i,h in enumerate(handles)]
return sqs.delete_message_batch(QueueUrl=url, Entries=entries)
Attributs clés
| Clé | RÎle | Valeur |
|---|---|---|
| VisibilityTimeout | FenĂȘtre de traitement | P95 + marge |
| RedrivePolicy | DLQ & maxReceiveCount | 3â5 |
| DelaySeconds | Retard global | 0â900 |
| MessageRetentionPeriod | TTL | 1mâ14j |
