Correspondances de sources d'événements et traitement de flux

Applications sans serveur avec AWS Lambda

Claudio Canales

Senior DevOps Engineer

Où s'intègrent les correspondances de sources d'événements

  • Les files et flux sont souvent sondés par lots.
  • Les correspondances de sources gèrent le sondage et le groupement en lots.

Position de la correspondance de source d'événements

Applications sans serveur avec AWS Lambda

Qu'est-ce qu'une correspondance de source d'événements ?

  • Une ressource qui relie une source à votre fonction.
  • Lambda sonde la source pour obtenir des enregistrements.
  • Lambda appelle votre gestionnaire avec un lot.

Flux de la correspondance de source d'événements

Applications sans serveur avec AWS Lambda

Poussée vs sondage (pourquoi c'est important)

Modèle par poussée

  • Les sources poussent les événements immédiatement.
  • Exemple : un téléversement vers Amazon S3.

Modèle par sondage

  • Lambda vérifie les sources par sondage.
  • Lambda constitue un lot et appelle votre gestionnaire.
  • Cela modifie la latence et la stratégie de reprise.

Modèles poussés vs sondés

Applications sans serveur avec AWS Lambda

File vs flux

File (Amazon SQS)

  • Une file de messages gérée, comme une boîte de réception.

Flux (DynamoDB Streams)

  • Un journal des changements pour une table DynamoDB.
  • Tous arrivent comme Records, mais leur sens diffère.

Comparaison file vs flux

Applications sans serveur avec AWS Lambda

Structure d'un événement par lot (simplifiée)

{
  "Records": [{
    "messageId": "abc-123",
    "body": "{\"order_id\": \"A-42\"}"
  }]
}
  • La plupart des événements de correspondance commencent par Records.
  • Chaque enregistrement a un messageId et une chaîne body.
  • Analysez body pour créer votre propre charge utile.
Applications sans serveur avec AWS Lambda

Guide : traiter chaque enregistrement

def lambda_handler(event, context):
    records = event.get("Records", [])
    for record in records:
        body = record.get("body", "")
        print("BODY:", body)
    return {"statusCode": 200}
  • Lisez Records avec une liste par défaut.
  • Parcourez chaque enregistrement et lisez body en toute sécurité.
  • Consignez l'essentiel, puis retournez la réponse.
Applications sans serveur avec AWS Lambda

Guide : analyser un corps JSON

import json

def lambda_handler(event, context):
    record = event.get("Records", [])[0]
    payload = json.loads(record.get("body", "{}"))
    order_id = payload.get("order_id")
    print("ORDER_ID:", order_id)
    return {"statusCode": 200}
  • Importez json et lisez body avec une valeur sûre par défaut.
  • Analysez avec json.loads pour obtenir un dict.
  • Extrayez les champs requis ; validez toujours d'abord.
Applications sans serveur avec AWS Lambda

Regroupement : taille et fenêtre de lot

  • Taille de lot : nombre d'enregistrements par appel.
  • Fenêtre de lot : délai d'attente de Lambda pour remplir un lot.
  • Des lots plus gros augmentent le débit mais ajoutent du travail par exécution.
  • Pour SQS, surveillez ApproximateAgeOfOldestMessage pour l'arriéré.

Diagramme des compromis sur la taille de lot

Applications sans serveur avec AWS Lambda

Compromis sur la taille des lots

  • De grands lots sont efficaces mais peuvent accroître la latence.
  • De petits lots réduisent le délai initial, mais augmentent les appels.
  • Choisissez selon votre charge de travail.

Taille de lot vs latence

Applications sans serveur avec AWS Lambda

Mise à l'échelle par simultanéité

  • Plusieurs lots sont traités en parallèle.
  • Plus de simultanéité augmente le débit.
  • Mais cela accroît aussi la charge en aval.

Traitement simultané de lots

Applications sans serveur avec AWS Lambda

Protéger les systèmes en aval

  • Trop de simultanéité peut surcharger une base de données ou une API.
  • Utilisez des limites pour contrôler la charge.
  • Privilégiez de petites unités de travail sûres.

Protection contre la charge en aval

Applications sans serveur avec AWS Lambda

Échecs partiels de lot

  • Un lot peut contenir de bons et de mauvais enregistrements.
  • Sans échecs partiels, un seul mauvais enregistrement relance tout le lot.
  • La gestion des échecs partiels ne relance que les éléments en échec.

Flux d'échec partiel de lot

Applications sans serveur avec AWS Lambda

Guide : signaler des échecs partiels (SQS)

def lambda_handler(event, context):
    failures = []
    for record in event.get("Records", []):
        try:
            process(record)
        except Exception:
            failures.append({"itemIdentifier": record["messageId"]})
    return {"batchItemFailures": failures}
  • Recueillez les messageId des échecs dans batchItemFailures.
  • Lambda relance seulement ces éléments.
  • Les enregistrements réussis ne sont pas renvoyés.
Applications sans serveur avec AWS Lambda

Points clés

  • Les correspondances de sources d'événements sondent files et flux.
  • Elles livrent des Records en lots à votre gestionnaire.
  • La taille et la fenêtre de lot échangent latence et débit.
  • Les échecs partiels évitent de retraiter les réussites.

Diagramme récapitulatif des correspondances

Applications sans serveur avec AWS Lambda

Passons à la pratique !

Applications sans serveur avec AWS Lambda

Preparing Video For Download...