Основы событийной архитектуры

Бессерверные приложения с AWS Lambda

Claudio Canales

Senior DevOps Engineer

Повторение: модель работы Lambda

  • Источник событий: что запускает Lambda.
  • Полезная нагрузка: JSON с описанием события.
  • Обработчик: код, который его обрабатывает.
  • Результат: ответ или побочный эффект.
  • Логи: место для отладки.

Поток выполнения Lambda

Бессерверные приложения с AWS Lambda

События — это сообщения

  • Событие описывает произошедшее действие.
  • Обычно это JSON-сообщение с метаданными.
  • Обработчик извлекает поля и выполняет действие.

Аналогия дверного звонка для событий

Бессерверные приложения с AWS Lambda

Распространённые источники событий в AWS

  • Amazon S3 генерирует события при загрузке файлов.
  • Amazon SQS — управляемая очередь для доставки сообщений.
  • DynamoDB Streams формирует журнал изменений.
  • Каждый источник создаёт собственную JSON-нагрузку.

Источники событий: S3, SQS и Streams

Бессерверные приложения с AWS Lambda

Синхронный и асинхронный вызов

  • Синхронный: вызывающий ждёт результата.
  • Асинхронный: вызывающий получает подтверждение; событие обрабатывается позже.

Аналогия: синхронный и асинхронный вызов

Бессерверные приложения с AWS Lambda

Основы событийной архитектуры

  • События поступают как JSON от сервисов AWS.
  • Режим вызова определяет, где появляются ошибки.
  • Нагрузки различаются — разбирайте и проверяйте их защитно.
  • Учитывайте повторные попытки и дубликаты.

Ключевые выводы

Бессерверные приложения с AWS Lambda

Нагрузки — это контракты

  • Нагрузки — это контракты: структуру определяет отправитель.
  • Обработчик должен знать, где искать нужные поля.
  • Извлеките данные, проверьте их, обработайте и залогируйте.

Контракт нагрузки и схема разбора

Бессерверные приложения с AWS Lambda

Пример нагрузки: событие SQS

Размеченная нагрузка события SQS

  • Records — это пакет сообщений.
  • body — строка.
  • messageId помогает трассировать и дедуплицировать.
Бессерверные приложения с AWS Lambda

Разбор: перебор Records в цикле

def lambda_handler(event, context):
    records = event.get("Records", [])
    for record in records:
        body = record.get("body", "")
        print("BODY:", body)
    return {"statusCode": 200}
  • Читайте Records с безопасным значением по умолчанию.
  • Перебирайте записи и извлекайте тело.
  • Логируйте важное, затем возвращайте результат.

Перебор Records в цикле

Бессерверные приложения с AWS Lambda

Разбор: безопасный разбор тела JSON

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 — строка; разберите её с помощью json.loads.
  • Используйте безопасное значение по умолчанию, например "{}".
  • Извлеките order_id и верните JSON через json.dumps.

Схема разбора тела сообщения

Бессерверные приложения с AWS Lambda

Контрольный список защитного разбора

Контрольный список защитного разбора

  • Залогируйте структуру события при знакомстве с новым источником.
  • Используйте .get() и значения по умолчанию для необязательных полей.
  • Проверяйте обязательные поля и возвращайте понятные ошибки.
  • Обрабатывайте пустые пакеты и отсутствующие ключи.
Бессерверные приложения с AWS Lambda

Проектирование с учётом повторов и дубликатов

  • Многие источники событий используют доставку «хотя бы один раз».
  • Дубликаты возможны.
  • Проектируйте идемпотентные обработчики: повторная обработка не должна ломать логику.

Повторные попытки и дубликаты

Бессерверные приложения с AWS Lambda

Идемпотентность на практике

  • Выберите уникальный ключ, например messageId или order_id.
  • Сохраняйте каждый обработанный ключ в DynamoDB.
  • Проверяйте наличие ключа: если он есть — пропускайте обработку.

Схема принятия решений при идемпотентности

Бессерверные приложения с AWS Lambda

Ключевые выводы

  • События поступают как JSON от сервисов AWS.
  • Режим вызова определяет, где появляются ошибки.
  • Нагрузки различаются — разбирайте и проверяйте их защитно.
  • Учитывайте повторные попытки и дубликаты.

Ключевые выводы

Бессерверные приложения с AWS Lambda

Давайте потренируемся!

Бессерверные приложения с AWS Lambda

Preparing Video For Download...