Mapování zdrojů událostí a zpracování streamů

Serverless Applications with AWS Lambda

Claudio Canales

Senior DevOps Engineer

Místo mapování zdrojů událostí v architektuře

  • Fronty a streamy se zpravidla dotazují v dávkách.
  • Mapování zdrojů událostí řídí dotazování a dávkování.

Pozice mapování zdrojů událostí

Serverless Applications with AWS Lambda

Co je mapování zdrojů událostí?

  • Prostředek, který propojuje zdroj s tvou funkcí.
  • Lambda dotazuje zdroj na záznamy.
  • Lambda volá tvůj handler s dávkou.

Tok mapování zdrojů událostí

Serverless Applications with AWS Lambda

Push vs poll (proč na tom záleží)

Model push

  • Zdroje typu push posílají události okamžitě.
  • Příklad: nahrání souboru do Amazon S3.

Model poll

  • Zdroje typu poll Lambda aktivně dotazuje.
  • Lambda sestaví dávku a zavolá tvůj handler.
  • To ovlivňuje latenci a chování při opakování.

Modely push vs poll

Serverless Applications with AWS Lambda

Fronta vs stream

Fronta (Amazon SQS)

  • Spravovaná fronta zpráv, jako doručená pošta.

Stream (DynamoDB Streams)

  • Záznam změn v tabulce DynamoDB.
  • Oboje přichází jako Records, ale jejich význam se liší.

Srovnání fronty a streamu

Serverless Applications with AWS Lambda

Struktura dávkové události (zjednodušeně)

{
  "Records": [{
    "messageId": "abc-123",
    "body": "{\"order_id\": \"A-42\"}"
  }]
}
  • Většina událostí mapování začíná polem Records.
  • Každý záznam má messageId a řetězec body.
  • Parsuj body do vlastního payloadu.
Serverless Applications with AWS Lambda

Průvodce: zpracování každého záznamu

def lambda_handler(event, context):
    records = event.get("Records", [])
    for record in records:
        body = record.get("body", "")
        print("BODY:", body)
    return {"statusCode": 200}
  • Načti Records s výchozím prázdným seznamem.
  • Projdi každý záznam a bezpečně přečti body.
  • Zaloguj co potřebuješ a vrať odpověď.
Serverless Applications with AWS Lambda

Průvodce: parsování JSON body

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}
  • Importuj json a načti body s bezpečnou výchozí hodnotou.
  • Parsuj pomocí json.loads a získej slovník.
  • Vyber potřebná pole; vždy nejdřív ověř vstup.
Serverless Applications with AWS Lambda

Dávkování: velikost a okno dávky

  • Velikost dávky: počet záznamů na jedno volání.
  • Okno dávky: jak dlouho Lambda čeká na naplnění dávky.
  • Větší dávky zvyšují propustnost, ale přidávají práci na jedno volání.
  • Pro SQS sleduj ApproximateAgeOfOldestMessage kvůli backlogu.

Diagram kompromisu velikosti dávky

Serverless Applications with AWS Lambda

Kompromisy velikosti dávky

  • Velké dávky jsou efektivní, ale mohou zvyšovat latenci.
  • Malé dávky zkracují dobu do prvního zpracování, ale zvyšují počet volání.
  • Volbu přizpůsob svému pracovnímu zatížení.

Graf velikosti dávky vs latence

Serverless Applications with AWS Lambda

Škálování pomocí souběžnosti

  • Více dávek se zpracovává současně.
  • Vyšší souběžnost zvyšuje propustnost.
  • Zároveň ale zvyšuje zátěž navazujících systémů.

Souběžné zpracování dávek

Serverless Applications with AWS Lambda

Ochrana navazujících systémů

  • Příliš vysoká souběžnost může přetížit databázi nebo API.
  • Pomocí limitů zátěž kontroluj.
  • Preferuj malé, bezpečné jednotky práce.

Ochrana navazujících systémů před přetížením

Serverless Applications with AWS Lambda

Částečná selhání dávky

  • Dávka může obsahovat platné i chybné záznamy.
  • Bez částečného selhání jeden chybný záznam způsobí opakování celé dávky.
  • Zpracování částečných selhání umožňuje opakovat jen neúspěšné položky.

Tok částečného selhání dávky

Serverless Applications with AWS Lambda

Průvodce: hlášení částečných selhání (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}
  • Sbírej messageId neúspěšných záznamů do batchItemFailures.
  • Lambda zopakuje pouze tyto položky.
  • Úspěšně zpracované záznamy se znovu neodesílají.
Serverless Applications with AWS Lambda

Hlavní poznatky

  • Mapování zdrojů událostí dotazuje fronty a streamy.
  • Doručuje záznamy v dávkách do tvého handleru.
  • Velikost a okno dávky jsou kompromisem mezi latencí a propustností.
  • Částečná selhání zabraňují opakování úspěšně zpracovaných položek.

Souhrnný diagram mapování

Serverless Applications with AWS Lambda

Pojďme cvičit!

Serverless Applications with AWS Lambda

Preparing Video For Download...