Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

🟧 AWS SQS – Architecture, OpĂ©rations & Bonnes Pratiques

Standard & FIFO queues, DLQ, visibilité, intégrations SNS/Lambda, sécurité, coûts, monitoring & troubleshooting.

1.1

Vue d’ensemble

Concepts, Standard vs FIFO, vocabulaire.

StandardFIFODLQ
1.2

Architecture

Visibilité, redelivery, DLQ, dédup.

VisibilityRedrive
1.3

Installation AWS

Console, CLI, CFN, Terraform, IAM.

IAMKMS
2.1

Producteurs

Python (boto3), batch, idempotence.

SendBatch
2.2

Consommateurs

Workers Python, Lambda, backoff.

ReceiveVisibility
2.3

Fonctionnalités

DLQ, timers, delay, SSE-KMS.

DelayKMS
3.1

Intégrations

SNS fanout, Lambda, Step Functions.

SNSLambda
3.2

Performance & Coûts

Throughput, quotas, optimisations.

BatchPricing
3.3

Monitoring

CloudWatch, alarmes, métriques.

CWAlarms
4.0

Best Practices

Prod/SRE, sécurité, gouvernance.

SRESecurity
4.1

Troubleshooting

Poison msg, redeliver, throttling.

PoisonThrottling
4.2

Cas d’usage

Web, IoT, ETL, microservices.

AsyncBuffer
4.3

Références

Docs officielles & guides.

AWS Docs
1.1 Vue d’ensemble – Standard vs FIFO
Dé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ĂšreStandardFIFOUtilisation
OrdreBest effortStrict par MessageGroupIdLogs, Tracking vs Paiements, Commandes
DĂ©bit~illimitĂ©300 → 3000 msg/sBulk processing vs Transactions synchronisĂ©es
DĂ©duplicationNon natifDeduplicationId (5 min window)Éviter doublons mĂ©tiers
CoûtMoins cherLégÚrement plus cherComparer 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.
1.2 Architecture – VisibilitĂ©, DLQ, DĂ©duplication, Redelivery
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
1.3 Installation AWS – Console, CLI, CloudFormation, Terraform, IAM
  1. Aller sur AWS Console → SQS → Create queue.
  2. Choisir Standard ou FIFO (cocher FIFO et Content-based dedup si besoin).
  3. Configurer VisibilityTimeout, MessageRetention, DLQ, SSE.
  4. 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.

2.1 Producteurs – Python (boto3), Batch, Idempotence
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)
    
2.2 Consommateurs – Worker Python, Lambda, Backoff
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_visibility pour 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
    
2.3 FonctionnalitĂ©s – Delay, Timers, Extended Client, SSE
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.

3.1 IntĂ©grations – SNS, Lambda, Step Functions
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.

3.2 Performance & CoĂ»ts – DĂ©bit, Formules, Optimisations
SujetStandardFIFO
DĂ©bitIllimitĂ©~300 msg/s/shard → ~3k avec batch
Batch≀10≀10
Taille256 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
    
3.3 Monitoring – CloudWatch, Alarmes, ObservabilitĂ©
Métriques clés
MétriqueSignificationSeuils
ApproximateNumberOfMessagesVisibleBacklog> seuil SLO
ApproximateNumberOfMessagesNotVisibleIn‑flightSuivre tendance
ApproximateAgeOfOldestMessageÂge max> X minutes → alarme
NumberOfMessages*DébitBaseline/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).

4.1 Troubleshooting – Playbooks Incidents
  • 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).
4.2 Cas d’usage & Patterns
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.
4.0 Best Practices – Prod/SRE, SĂ©curitĂ©, Gouvernance
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.
Références officielles & liens utiles
  • 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).
Cheat‑sheet – CLI, Python snippets & Attributs clĂ©s
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ÎleValeur
VisibilityTimeoutFenĂȘtre de traitementP95 + marge
RedrivePolicyDLQ & maxReceiveCount3–5
DelaySecondsRetard global0–900
MessageRetentionPeriodTTL1m–14j