Mapeamentos de origem de eventos e processamento de streams

Aplicações Serverless com AWS Lambda

Claudio Canales

Senior DevOps Engineer

Onde os mapeamentos se encaixam

  • Filas e streams são consultados em lotes.
  • Mapeamentos de origem de eventos gerenciam polling e batching.

Posição do mapeamento de origem

Aplicações Serverless com AWS Lambda

O que é um mapeamento de origem de eventos?

  • Um recurso que conecta uma origem à sua função.
  • A Lambda faz polling da origem por records.
  • A Lambda invoca seu handler com um lote.

Fluxo do mapeamento de origem

Aplicações Serverless com AWS Lambda

Push vs poll (por que importa)

Modelo push

  • Origens push enviam eventos na hora.
  • Exemplo: upload no Amazon S3.

Modelo poll

  • Origens poll são verificadas pela Lambda.
  • A Lambda monta um lote e invoca seu handler.
  • Isso muda latência e tentativas.

Modelos push vs poll

Aplicações Serverless com AWS Lambda

Fila vs stream

Fila (Amazon SQS)

  • Fila de mensagens gerenciada, como uma caixa de entrada.

Stream (DynamoDB Streams)

  • Log de mudanças de uma tabela DynamoDB.
  • Ambos chegam como Records, mas o significado difere.

Comparação: fila vs stream

Aplicações Serverless com AWS Lambda

Formato do evento em lote (simplificado)

{
  "Records": [{
    "messageId": "abc-123",
    "body": "{\"order_id\": \"A-42\"}"
  }]
}
  • A maioria dos eventos começa com Records.
  • Cada record tem messageId e uma string body.
  • Faça o parse de body no seu payload.
Aplicações Serverless com AWS Lambda

Passo a passo: processar cada record

def lambda_handler(event, context):
    records = event.get("Records", [])
    for record in records:
        body = record.get("body", "")
        print("BODY:", body)
    return {"statusCode": 200}
  • Leia Records com lista padrão.
  • Itere cada record e leia body com segurança.
  • Registre o necessário e retorne.
Aplicações Serverless com AWS Lambda

Passo a passo: fazer parse do JSON do 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}
  • Importe json e leia body com valor padrão.
  • Faça parse com json.loads para obter um dict.
  • Extraia os campos necessários; sempre valide antes.
Aplicações Serverless com AWS Lambda

Lotes: tamanho e janela

  • Tamanho do lote: quantos records por invocação.
  • Janela do lote: quanto tempo a Lambda espera para preencher.
  • Lotes maiores aumentam throughput, mas exigem mais por execução.
  • No SQS, monitore ApproximateAgeOfOldestMessage para backlog.

Diagrama de trade-off do tamanho do lote

Aplicações Serverless com AWS Lambda

Trade-offs do tamanho do lote

  • Lotes grandes são eficientes, mas aumentam a latência.
  • Lotes pequenos reduzem o tempo até o primeiro processamento, mas aumentam invocações.
  • Escolha conforme sua carga.

Tamanho do lote vs latência

Aplicações Serverless com AWS Lambda

Escala com concorrência

  • Vários lotes são processados ao mesmo tempo.
  • Mais concorrência aumenta o throughput.
  • Mas também aumenta a carga downstream.

Processamento concorrente de lotes

Aplicações Serverless com AWS Lambda

Proteja sistemas downstream

  • Concorrência demais pode sobrecarregar um banco ou API.
  • Use limites para controlar a carga.
  • Prefira unidades de trabalho pequenas e seguras.

Proteção da carga downstream

Aplicações Serverless com AWS Lambda

Falhas parciais de lote

  • Um lote pode ter records bons e ruins.
  • Sem falhas parciais, um record ruim reprocessa o lote todo.
  • Falhas parciais permitem reprocessar só os itens com erro.

Fluxo de falha parcial de lote

Aplicações Serverless com AWS Lambda

Passo a passo: relatar falhas parciais (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}
  • Colete messageIds dos records com erro em batchItemFailures.
  • A Lambda retenta só esses itens.
  • Records processados com sucesso não são reenviados.
Aplicações Serverless com AWS Lambda

Principais pontos

  • Mapeamentos de origem fazem polling de filas e streams.
  • Eles entregam Records em lotes para seu handler.
  • Tamanho e janela do lote trocam latência por throughput.
  • Falhas parciais evitam reprocesar sucessos.

Resumo do mapeamento

Aplicações Serverless com AWS Lambda

Vamos praticar!

Aplicações Serverless com AWS Lambda

Preparing Video For Download...