Podstawy architektury sterowanej zdarzeniami

Serverless Applications with AWS Lambda

Claudio Canales

Senior DevOps Engineer

Podsumowanie: model myślowy Lambda

  • Źródło zdarzenia: co wyzwala Lambda.
  • Ładunek zdarzenia: JSON opisujący, co zaszło.
  • Handler: kod, który to przetwarza.
  • Wynik: odpowiedź lub efekt uboczny.
  • Logi: tu szukasz błędów.

Przepływ wykonania Lambda

Serverless Applications with AWS Lambda

Zdarzenia to wiadomości

  • Zdarzenie opisuje coś, co zaszło.
  • Zazwyczaj to wiadomość JSON z metadanymi.
  • Handler wyciąga potrzebne pola i podejmuje działanie.

Analogia dzwonka do drzwi

Serverless Applications with AWS Lambda

Popularne źródła zdarzeń w AWS

  • Amazon S3 wyzwala zdarzenia przy przesyłaniu plików.
  • Amazon SQS to zarządzana kolejka dostarczająca wiadomości.
  • DynamoDB Streams generuje dziennik zmian.
  • Każde źródło tworzy inny ładunek JSON.

Źródła zdarzeń: S3 vs SQS vs Streams

Serverless Applications with AWS Lambda

Wywołanie synchroniczne vs asynchroniczne

  • Synchroniczne: wywołujący czeka na wynik.
  • Asynchroniczne: wywołujący dostaje potwierdzenie; zdarzenie jest przetwarzane później.

Analogia: synchroniczne vs asynchroniczne

Serverless Applications with AWS Lambda

Podstawy architektury sterowanej zdarzeniami

  • Zdarzenia przychodzą jako JSON z serwisów AWS.
  • Tryb wywołania decyduje o tym, gdzie pojawiają się błędy.
  • Ładunki są różne — parsuj i waliduj defensywnie.
  • Zakładaj, że ponowne próby i duplikaty wystąpią.

Podsumowanie kluczowych wniosków

Serverless Applications with AWS Lambda

Ładunki to kontrakty

  • Ładunki to kontrakty: nadawca decyduje o strukturze.
  • Handler musi wiedzieć, gdzie szukać poszczególnych pól.
  • Wyciągnij potrzebne dane, zwaliduj, przetwórz i zaloguj.

Kontrakt ładunku i przepływ parsowania

Serverless Applications with AWS Lambda

Przykładowy ładunek: zdarzenie SQS

Opatrzony komentarzami ładunek zdarzenia SQS

  • Records to partia wiadomości.
  • body to ciąg znaków.
  • messageId pomaga śledzić i deduplikować.
Serverless Applications with AWS Lambda

Krok po kroku: iteracja po Records

def lambda_handler(event, context):
    records = event.get("Records", [])
    for record in records:
        body = record.get("body", "")
        print("BODY:", body)
    return {"statusCode": 200}
  • Odczytaj Records z bezpieczną wartością domyślną.
  • Iteruj po rekordach i wyciągaj body.
  • Zaloguj to, co ważne, i zwróć odpowiedź.

Iteracja po Records

Serverless Applications with AWS Lambda

Krok po kroku: bezpieczne parsowanie JSON z 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 to ciąg znaków; parsuj go przez json.loads.
  • Używaj bezpiecznej wartości domyślnej, np. "{}".
  • Wyciągnij order_id i zwróć JSON przez json.dumps.

Przepływ parsowania body

Serverless Applications with AWS Lambda

Lista kontrolna: defensywne parsowanie

Lista kontrolna defensywnego parsowania

  • Zaloguj strukturę zdarzenia raz, gdy poznajesz nowe źródło.
  • Używaj .get() i wartości domyślnych dla opcjonalnych pól.
  • Waliduj wymagane pola i zwracaj czytelne błędy.
  • Obsługuj puste partie i brakujące klucze.
Serverless Applications with AWS Lambda

Projektuj z myślą o ponownych próbach i duplikatach

  • Wiele źródeł zdarzeń stosuje dostarczanie co najmniej raz.
  • Duplikaty mogą się zdarzyć.
  • Projektuj idempotentne handlery — dwukrotne przetworzenie nie powinno zmienić wyniku.

Ponowne próby i duplikaty

Serverless Applications with AWS Lambda

Idempotentność w praktyce

  • Wybierz unikalny klucz, np. messageId lub order_id.
  • Zapisuj każdy przetworzony klucz w DynamoDB.
  • Sprawdź, czy klucz już istnieje; jeśli tak — pomiń przetwarzanie.

Diagram decyzyjny idempotentności

Serverless Applications with AWS Lambda

Najważniejsze wnioski

  • Zdarzenia przychodzą jako JSON z serwisów AWS.
  • Tryb wywołania decyduje o tym, gdzie pojawiają się błędy.
  • Ładunki są różne — parsuj i waliduj defensywnie.
  • Zakładaj, że ponowne próby i duplikaty wystąpią.

Podsumowanie kluczowych wniosków

Serverless Applications with AWS Lambda

Czas na praktykę!

Serverless Applications with AWS Lambda

Preparing Video For Download...