Відображення джерел подій і обробка потоків

Безсерверні застосунки з AWS Lambda

Claudio Canales

Senior DevOps Engineer

Де застосовуються відображення джерел подій

  • Черги й потоки часто опитуються пакетами.
  • Відображення джерел подій керують опитуванням і пакетуванням.

Розташування відображення джерела подій

Безсерверні застосунки з AWS Lambda

Що таке відображення джерела подій?

  • Ресурс, що з'єднує джерело з вашою функцією.
  • Lambda опитує джерело на наявність записів.
  • Lambda викликає ваш обробник з пакетом.

Потік роботи відображення джерела подій

Безсерверні застосунки з AWS Lambda

Push vs poll (чому це важливо)

Push-модель

  • Джерела push надсилають події негайно.
  • Приклад: завантаження в Amazon S3.

Poll-модель

  • Джерела poll опитує Lambda.
  • Lambda формує пакет і викликає ваш обробник.
  • Це впливає на затримку та повторні спроби.

Порівняння push і poll моделей

Безсерверні застосунки з AWS Lambda

Черга vs потік

Черга (Amazon SQS)

  • Керована черга повідомлень, як поштова скринька.

Потік (DynamoDB Streams)

  • Журнал змін для таблиці DynamoDB.
  • Обидва надходять як Records, але значення різне.

Порівняння черги й потоку

Безсерверні застосунки з AWS Lambda

Форма пакетної події (спрощено)

{
  "Records": [{
    "messageId": "abc-123",
    "body": "{\"order_id\": \"A-42\"}"
  }]
}
  • Більшість подій відображення починаються з Records.
  • Кожен запис має messageId і рядок body.
  • Розберіть body у власний payload.
Безсерверні застосунки з AWS Lambda

Покроково: обробка кожного запису

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

Покроково: розбір 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}
  • Імпортуйте json і читайте body з безпечним значенням за замовчуванням.
  • Розберіть json.loads, щоб отримати dict.
  • Витягніть потрібні поля; завжди спершу перевіряйте.
Безсерверні застосунки з AWS Lambda

Пакетування: розмір і вікно пакета

  • Розмір пакета: скільки записів за виклик.
  • Вікно пакета: скільки Lambda чекає, щоб наповнити пакет.
  • Більші пакети підвищують пропускну здатність, але додають роботу на запуск.
  • Для SQS відстежуйте ApproximateAgeOfOldestMessage для черги.

Компроміс розміру пакета

Безсерверні застосунки з AWS Lambda

Компроміси розміру пакета

  • Великі пакети ефективні, але збільшують затримку.
  • Малі пакети скорочують час до першої обробки, але збільшують кількість викликів.
  • Обирайте під свій тип навантаження.

Зв'язок розміру пакета й затримки

Безсерверні застосунки з AWS Lambda

Масштабування за рахунок паралельності

  • Кілька пакетів обробляються одночасно.
  • Вища паралельність підвищує пропускну здатність.
  • Але також збільшує навантаження на нижчі рівні.

Паралельна обробка пакетів

Безсерверні застосунки з AWS Lambda

Захист нижчих систем

  • Надмірна паралельність може перевантажити базу даних або API.
  • Використовуйте ліміти, щоб контролювати навантаження.
  • Надавайте перевагу малим, безпечним одиницям роботи.

Захист від навантаження нижчих систем

Безсерверні застосунки з AWS Lambda

Часткові збої в пакетах

  • Пакет може містити коректні й помилкові записи.
  • Без часткових збоїв один поганий запис перезапускає весь пакет.
  • Обробка часткових збоїв дає змогу повторити лише помилки.

Потік обробки часткового збою пакета

Безсерверні застосунки з AWS Lambda

Покроково: звітування про часткові збої (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}
  • Збирайте messageId помилкових записів у batchItemFailures.
  • Lambda повторює лише ці елементи.
  • Успішно оброблені записи не надсилаються знову.
Безсерверні застосунки з AWS Lambda

Основні висновки

  • Відображення джерел подій опитують черги та потоки.
  • Вони передають Records пакетами вашому обробнику.
  • Розмір і вікно пакета змінюють баланс затримки та пропускної здатності.
  • Часткові збої уникають повторної обробки успішних записів.

Підсумкова схема відображень

Безсерверні застосунки з AWS Lambda

Давайте потренуємось!

Безсерверні застосунки з AWS Lambda

Preparing Video For Download...