Základy architektury řízené událostmi

Serverless Applications with AWS Lambda

Claudio Canales

Senior DevOps Engineer

Rekapitulace: mentální model Lambda

  • Zdroj události: co spustí Lambda.
  • Payload události: JSON popisující, co se stalo.
  • Handler: kód, který to zpracuje.
  • Výsledek: odpověď nebo vedlejší efekt.
  • Logy: místo, kde ladíš chyby.

Průběh vykonání Lambda

Serverless Applications with AWS Lambda

Události jsou zprávy

  • Událost popisuje něco, co se stalo.
  • Většinou jde o JSON zprávu s metadaty.
  • Handler vyextrahuje pole a provede akci.

Analogie zvonku u dveří pro události

Serverless Applications with AWS Lambda

Běžné zdroje událostí v AWS

  • Amazon S3 spouští události při nahrání souborů.
  • Amazon SQS je spravovaná fronta pro doručování zpráv.
  • DynamoDB Streams produkuje záznam změn.
  • Každý zdroj generuje jiný JSON payload.

Zdroje událostí: S3 vs SQS vs Streams

Serverless Applications with AWS Lambda

Synchronní vs. asynchronní volání

  • Synchronní: volající čeká na výsledek.
  • Asynchronní: volající dostane potvrzení; událost se zpracuje později.

Analogie synchronní vs. asynchronní

Serverless Applications with AWS Lambda

Základy architektury řízené událostmi

  • Události přicházejí jako JSON ze služeb AWS.
  • Režim volání ovlivňuje, kde se chyby zobrazí.
  • Payloady se liší — parsuj a validuj defenzivně.
  • Počítej s opakováním a duplikáty.

Pipeline klíčových poznatků

Serverless Applications with AWS Lambda

Payloady jsou smlouvy

  • Payloady jsou smlouvy: tvar určuje odesílatel.
  • Handler musí vědět, kde hledat jednotlivá pole.
  • Extrahuj potřebná data, ověř je, zpracuj a zaloguj.

Smlouva payloadu a průběh parsování

Serverless Applications with AWS Lambda

Příklad payloadu: SQS message event

Anotovaný SQS event payload

  • Records je dávka.
  • body je řetězec.
  • messageId slouží ke sledování a deduplikaci.
Serverless Applications with AWS Lambda

Průvodce: iterace přes Records

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 bezpečnou výchozí hodnotou.
  • Projdi každý záznam a extrahuj body.
  • Zaloguj důležité informace a vrať odpověď.

Procházení Records ve smyčce

Serverless Applications with AWS Lambda

Průvodce: bezpečné parsování JSON body

import json
def lambda_handler(event, context):
    records = event.get("Records") or [{}]
    body = records[0].get("body", "{}")
    payload = json.loads(body)
    oid = payload.get("order_id")
    return json.dumps({"order_id": oid})
  • body je řetězec; zparsuj ho pomocí json.loads.
  • Čti s bezpečnou výchozí hodnotou, například "{}".
  • Extrahuj order_id a vrať JSON pomocí json.dumps.

Průběh parsování body

Serverless Applications with AWS Lambda

Kontrolní seznam pro defenzivní parsování

Kontrolní seznam pro defenzivní parsování

  • Při poznávání nového zdroje zaloguj jednou strukturu události.
  • Pro volitelná pole používej .get() s výchozí hodnotou.
  • Ověř povinná pole a vrať srozumitelné chyby.
  • Ošetři prázdné dávky a chybějící klíče.
Serverless Applications with AWS Lambda

Navrhuj s ohledem na opakování a duplikáty

  • Mnoho zdrojů událostí garantuje doručení alespoň jednou.
  • Duplikáty se mohou vyskytnout.
  • Navrhuj idempotentní handlery, aby dvojité zpracování nevedlo k chybám.

Opakované pokusy a duplikáty

Serverless Applications with AWS Lambda

Idempotence v praxi

  • Zvol jedinečný klíč, například messageId nebo order_id.
  • Každý zpracovaný klíč ulož do DynamoDB.
  • Zkontroluj, zda klíč existuje; pokud ano, přeskoč zpracování.

Rozhodovací diagram idempotence

Serverless Applications with AWS Lambda

Klíčové poznatky

  • Události přicházejí jako JSON ze služeb AWS.
  • Režim volání ovlivňuje, kde se chyby zobrazí.
  • Payloady se liší — parsuj a validuj defenzivně.
  • Počítej s opakováním a duplikáty.

Pipeline klíčových poznatků

Serverless Applications with AWS Lambda

Pojďme cvičit!

Serverless Applications with AWS Lambda

Preparing Video For Download...