Базы данных
DynamoDB: serverless NoSQL от Amazon
Amazon Prime Day 2023: 375 миллионов товаров за 48 часов, 105,000 заказов в секунду в пике. Вся корзина, сессии, inventory - на DynamoDB. Ни один DBA не настраивал индексы ночью, никаких failover проблем - просто работало при любой нагрузке.
- **Amazon**: все корзины и сессии на DynamoDB - 99.999% availability SLA, <10ms P99
- **Lyft**: DynamoDB для real-time matching водителей - 20 млн поездок в день с предсказуемым latency
- **Airbnb**: DynamoDB Streams + Lambda для event-driven обработки бронирований
Модель данных DynamoDB
DynamoDB - управляемый key-value + document store от Amazon. Каждый элемент идентифицируется composite key: partition key (PK) + опциональный sort key (SK). Схема гибкая: разные items могут иметь разные атрибуты. Amazon проектировал DynamoDB под собственные требования: корзина покупок Prime Day должна работать при любой нагрузке с single-digit millisecond latency.
DynamoDB гарантирует <10ms P99 latency при любой нагрузке - это SLA, а не benchmark. Достигается через автоматическое шардирование, SSD storage, и DAX (DynamoDB Accelerator - in-memory cache).
Что делает DynamoDB с схемой таблицы?
Global и Local Secondary Indexes
DynamoDB поддерживает только запросы по PK. Для поиска по другим атрибутам нужны индексы. LSI - альтернативный sort key для той же partition (создаётся при создании таблицы). GSI - полностью другой PK+SK, создаёт отдельную копию данных (можно добавить позже).
GSI Overloading: в одном GSI хранить данные разных типов через prefix (STATUS#pending, CATEGORY#electronics). Вместо 5 GSI под разные запросы - один универсальный GSI.
Ключевое отличие GSI от LSI в DynamoDB?
Режимы мощности: Provisioned и On-Demand
DynamoDB измеряет throughput в RCU и WCU. 1 RCU = 1 strongly consistent read до 4KB. 1 WCU = 1 write до 1KB. Provisioned - резервируешь заранее, платишь за зарезервированное. On-Demand - платишь за фактические запросы.
| Параметр | Provisioned | On-Demand |
|---|---|---|
| Стоимость | Дешевле при стабильной нагрузке | Дороже, но нет платы за idle |
| Масштабирование | Auto Scaling (медленное) | Мгновенное, автоматическое |
| Подходит для | Предсказуемый трафик | Спайки, новые продукты, dev |
| Риск | Throttling при превышении | Неожиданные счета при DDoS |
Duolingo экономит 75% на DynamoDB используя Provisioned + Reserved Capacity (предоплата на год). Для startup с непредсказуемым трафиком On-Demand + Cost Anomaly Detection безопаснее.
Приложение с пиковой нагрузкой 10x в Black Friday, в остальное время - стабильная нагрузка. Какой режим?
Single-Table Design
Single-table design - паттерн хранения всех типов сущностей в одной таблице. Один запрос возвращает все нужные данные без JOIN. DynamoDB не поддерживает JOIN - связанные данные должны быть доступны по одному PK.
Главное преимущество single-table design в DynamoDB?
DynamoDB Streams и Event-Driven Architecture
DynamoDB Streams - ordered лог всех изменений (INSERT, MODIFY, REMOVE). Каждое изменение доступно 24 часа. Lambda триггеры на stream реализуют event-driven архитектуру без polling.
Kinesis Data Streams - альтернатива для сложных сценариев: 7 дней retention (vs 24ч), множество consumers, replay. DynamoDB Streams идеален для Lambda триггеров. Kinesis - для аналитики и сложного stream processing.
DynamoDB подходит для любых workload и всегда дешевле самоуправляемой БД
DynamoDB дорог при read-heavy аналитике (каждый RCU стоит деньги), плохо подходит для ad-hoc queries. На больших объёмах self-managed PostgreSQL часто дешевле.
DynamoDB оптимален для known access patterns, serverless архитектур, и когда operational overhead важнее стоимости. Для аналитики и OLAP лучше Redshift или ClickHouse.
DynamoDB Streams хранит события 24 часа. Lambda не справляется с нагрузкой. Что произойдёт?
Ключевые идеи
- **PK + SK**: partition key определяет узел, sort key - порядок; все запросы обязаны содержать PK
- **GSI**: отдельная копия с другим PK (eventual consistency, добавляется в любой момент); LSI - альтернативный SK, только при создании таблицы
- **Single-table design**: одна таблица для всех сущностей = один запрос для связанных данных, но сложнее в разработке
Связанные темы
DynamoDB воплощает принципы из нескольких областей:
- CAP теорема — DynamoDB - AP система с настраиваемой consistency
- Шардинг — DynamoDB автоматически шардирует по partition key
- Кеширование — DAX добавляет in-memory cache перед DynamoDB
Вопросы для размышления
- Когда DynamoDB предпочтительнее PostgreSQL на RDS несмотря на более высокую стоимость?
- Как проектировать single-table schema для системы User, Post, Comment, Like?
- DynamoDB Streams + Lambda vs Kafka + Kafka Streams: когда что выбрать?