Как использовать DynamoDB Stream и лямбда-функции для синхронизации нескольких таблиц
У меня есть очень распространенный сценарий использования, который требует синхронизации 2 таблиц DynamoDB. Логический поток будет следующим.
- Задание создано в Таблице заданий
- Несколько запросов создаются в таблице запросов. Все запросы создаются из одного задания, как и многие отношения к одному.
- Запросы обрабатываются некоторыми другими работниками.
- Каждый запрос будет помечен как выполненный независимо в таблице запросов.
- Когда все запросы на определенное задание завершены, отметьте задание в таблице заданий.
Прямо сейчас я думаю включить поток в таблице запросов. Когда запрос завершается, он запускает лямбда-функцию для проверки завершения всех запросов.
Я прочитал много документов. И найдите много ограничений этого подхода:
- Кажется, что stream + lambda гарантирует, что каждый потоковый фрагмент будет запускать лямбда-функцию хотя бы один раз, но не только один раз. Таким образом, лямбда-функция должна быть идемпотентной. (Пусть лямбда-функция для увеличения количества выполненных запросов здесь работать не будет).
Поэтому я думаю, что мне нужно сканировать таблицу запросов каждый раз, когда запускается лямбда-функция. Придется ли этому подходу много накладных расходов?
- Поток DynamoDB имеет тенденцию отправлять каждое событие в разные сегменты. Каждый осколок, когда он заполнен, запускает лямбда-функцию. Я не уверен, что, если осколок наполовину заполнен (нет событий в таблице). Будет ли он по-прежнему вызывать лямбда-функцию?
Я также открыт для всех других решений, которые могут решить эту проблему. Я не уверен, что следую лучшей практике здесь.
1 ответ
Я думаю, что вы можете решить эту проблему, используя другой сервер DynamoDB.
Вы можете создать отдельную таблицу в DynamoDB:
FinishedTasksJobId - ключ раздела - идентификатор заданияFinishedRequestId - ключ сортировки - идентификатор завершенного запроса
Каждая лямбда-работа будет делать следующее:
- Читать новый элемент из потока
- Написать новый элемент в FinishedTasks
- Прочитайте все законченные задачи для идентификатора работы
- Проверьте, все ли задачи выполнены
- Если все задачи выполнены, делай то, что нужно
В этом случае у вас есть идемпотентная задача (не имеет значения, если вы дважды переопределите элемент в FinishedTasks)
Конечно, вам нужно удалить старые элементы из FinishedTasks. Можно использовать функцию TTL для автоматического удаления старых элементов.