DynamoDB Streams
DynamoDB Streams — это функциональность сервиса Amazon DynamoDB, предоставляющая упорядоченный поток изменений данных в таблице в режиме, близком к реальному времени. Каждое событие в потоке представляет собой запись об изменении элемента таблицы (создании, обновлении или удалении) и содержит как новые, так и старые значения атрибутов (в зависимости от настроек). DynamoDB Streams позволяет приложениям реагировать на изменения данных без необходимости выполнять периодические опросы таблицы, что делает её ключевым компонентом для построения событийно-ориентированных архитектур, синхронизации данных и аудита.
История и развитие
DynamoDB Streams была анонсирована компанией Amazon Web Services (AWS) в 2014 году и выпущена в 2015 году. До появления этой функции разработчикам приходилось реализовывать собственную логику отслеживания изменений, что было сложно и ненадёжно. Внедрение Streams упростило создание приложений, которым требуется реагировать на обновления данных, например, для инкрементальной обработки, репликации между регионами или интеграции с другими сервисами AWS.
С момента запуска функциональность неоднократно улучшалась. В 2018 году была добавлена поддержка записей о старых и новых образах элементов (настройка StreamViewType), что позволило получать полную картину изменений. В 2020 году Streams стала основой для DynamoDB Accelerator (DAX) и других сервисов, а также была интегрирована с AWS Lambda для бессерверной обработки событий.
Архитектура и принцип работы
Включение и настройка
Для использования DynamoDB Streams необходимо включить поток для конкретной таблицы. При включении задаётся тип информации, которая будет записываться в поток:
KEYS_ONLY— только ключи элемента (первичный ключ и, если есть, ключ сортировки).NEW_IMAGE— полный образ элемента после изменения.OLD_IMAGE— полный образ элемента до изменения.NEW_AND_OLD_IMAGES— оба образа (до и после).
После включения поток автоматически начинает записывать изменения. Каждое изменение элемента таблицы генерирует одну запись в потоке. Поток хранит записи в течение 24 часов (по умолчанию), после чего они автоматически удаляются.
Структура потока
Поток состоит из шардов (shards), которые распределяют нагрузку и обеспечивают масштабируемость. Каждый шард содержит упорядоченную последовательность записей. Количество шардов автоматически управляется AWS и зависит от пропускной способности таблицы и объёма изменений. Каждая запись в потоке содержит:
eventID— уникальный идентификатор события.eventName— тип операции:INSERT,MODIFYилиREMOVE.eventSource— источник события (всегдаaws:dynamodb).awsRegion— регион AWS, где произошло изменение.dynamodb— объект с данными изменения, включая ключи, атрибуты (в зависимости отStreamViewType) и временную метку.userIdentity— информация о пользователе или сервисе, инициировавшем изменение (доступна не всегда).
Чтение из потока
Для чтения записей из DynamoDB Streams используются два основных подхода:
- AWS Lambda — наиболее распространённый способ. Можно настроить триггер Lambda, который будет автоматически вызываться при появлении новых записей в потоке. Lambda получает пакет записей (до 1000 или до 6 МБ) и обрабатывает их. Этот подход является бессерверным и масштабируется автоматически.
- API DynamoDB Streams — предоставляет низкоуровневые операции для чтения шардов и записей. Используется, когда требуется кастомная логика обработки, например, в приложениях на Java, Python или Go. Основные операции:
DescribeStream,ListShards,GetShardIterator,GetRecords.
Применение
DynamoDB Streams широко используется в различных сценариях:
Событийно-ориентированная архитектура
Поток изменений служит источником событий для микросервисов. Например, при добавлении нового заказа в таблицу DynamoDB, Streams может запустить Lambda-функцию, которая отправляет уведомление клиенту по email или обновляет кэш в Redis.
Репликация данных между регионами
DynamoDB Streams является основой для глобальных таблиц DynamoDB (Global Tables). Изменения в одной таблице автоматически реплицируются в таблицы в других регионах AWS через Streams. Это обеспечивает низкую задержку и высокую доступность для приложений, работающих по всему миру.
Интеграция с аналитическими системами
Изменения из Streams могут быть записаны в Amazon S3 (через Lambda или Kinesis Firehose) для последующего анализа с помощью Athena или Redshift. Например, можно собирать историю изменений цен на товары для построения отчётов.
Аудит и мониторинг
Поток позволяет фиксировать все изменения данных, что полезно для аудита. Записи можно отправлять в Amazon CloudWatch Logs или в Elasticsearch для поиска и визуализации.
Синхронизация с внешними системами
Streams используется для синхронизации данных DynamoDB с кэшами (например, Amazon ElastiCache), поисковыми индексами (Amazon OpenSearch Service) или реляционными базами данных (через AWS DMS).
Ограничения и особенности
- Срок хранения: записи хранятся всего 24 часа. Если приложение не успело обработать событие за это время, данные будут потеряны.
- Гарантии доставки: DynamoDB Streams обеспечивает как минимум однократную доставку (at-least-once). Это означает, что одна и та же запись может быть доставлена несколько раз, поэтому приложения должны быть идемпотентными.
- Порядок записей: записи внутри одного шарда упорядочены по времени. Однако порядок между шардами не гарантируется. Для глобальной упорядоченности необходимо использовать другие механизмы, например, Kinesis.
- Стоимость: взимается плата за каждое чтение из потока (запросы
GetRecords). Запись в поток (при изменении данных) не тарифицируется отдельно, но учитывается в пропускной способности таблицы. - Масштабируемость: количество шардов автоматически масштабируется, но при очень высокой частоте изменений может потребоваться настройка пропускной способности таблицы.
Сравнение с другими сервисами
| Характеристика | DynamoDB Streams | Amazon Kinesis Data Streams | Amazon SQS |
|---|---|---|---|
| Источник данных | Изменения в таблице DynamoDB | Любые данные (логи, события) | Сообщения от приложений |
| Срок хранения | 24 часа | До 365 дней | До 14 дней |
| Модель доставки | At-least-once | At-least-once | At-most-once / At-least-once |
| Упорядоченность | Внутри шарда | Внутри шарда | Не гарантируется |
| Интеграция с Lambda | Встроенная | Через триггер | Через триггер |
DynamoDB Streams оптимизирован специально для работы с DynamoDB, в то время как Kinesis и SQS являются более универсальными сервисами.
Пример использования
Рассмотрим простой пример: интернет-магазин использует DynamoDB для хранения заказов. Когда клиент оформляет заказ, в таблицу добавляется новый элемент. Включённый Streams с типом NEW_IMAGE фиксирует этот заказ. Настроенная Lambda-функция считывает запись, извлекает email клиента и отправляет подтверждение заказа через Amazon SES. Если заказ позже обновляется (например, меняется статус), Streams генерирует новое событие MODIFY, и Lambda может отправить уведомление об изменении статуса.
Безопасность и управление доступом
Доступ к DynamoDB Streams управляется через AWS Identity and Access Management (IAM). Для чтения из потока требуются разрешения на операции dynamodb:DescribeStream, dynamodb:GetShardIterator и dynamodb:GetRecords. Для включения Streams на таблице необходимо разрешение dynamodb:UpdateTable. Рекомендуется использовать принцип наименьших привилегий.
Источники
- AWS Documentation: DynamoDB Streams Developer Guide
- AWS re:Invent 2015: "DynamoDB Streams: Real-Time Data Processing"
- AWS Blog: "New – DynamoDB Streams" (2014)
- Amazon DynamoDB API Reference
- "Designing Data-Intensive Applications" by Martin Kleppmann (глава о потоковой обработке)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →