Как использовать DynamoDB Stream и лямбда-функции для синхронизации нескольких таблиц

У меня есть очень распространенный сценарий использования, который требует синхронизации 2 таблиц DynamoDB. Логический поток будет следующим.

  1. Задание создано в Таблице заданий
  2. Несколько запросов создаются в таблице запросов. Все запросы создаются из одного задания, как и многие отношения к одному.
  3. Запросы обрабатываются некоторыми другими работниками.
  4. Каждый запрос будет помечен как выполненный независимо в таблице запросов.
  5. Когда все запросы на определенное задание завершены, отметьте задание в таблице заданий.

Прямо сейчас я думаю включить поток в таблице запросов. Когда запрос завершается, он запускает лямбда-функцию для проверки завершения всех запросов.

Я прочитал много документов. И найдите много ограничений этого подхода:

  1. Кажется, что stream + lambda гарантирует, что каждый потоковый фрагмент будет запускать лямбда-функцию хотя бы один раз, но не только один раз. Таким образом, лямбда-функция должна быть идемпотентной. (Пусть лямбда-функция для увеличения количества выполненных запросов здесь работать не будет).

Поэтому я думаю, что мне нужно сканировать таблицу запросов каждый раз, когда запускается лямбда-функция. Придется ли этому подходу много накладных расходов?

  1. Поток DynamoDB имеет тенденцию отправлять каждое событие в разные сегменты. Каждый осколок, когда он заполнен, запускает лямбда-функцию. Я не уверен, что, если осколок наполовину заполнен (нет событий в таблице). Будет ли он по-прежнему вызывать лямбда-функцию?

Я также открыт для всех других решений, которые могут решить эту проблему. Я не уверен, что следую лучшей практике здесь.

1 ответ

Решение

Я думаю, что вы можете решить эту проблему, используя другой сервер DynamoDB.

Вы можете создать отдельную таблицу в DynamoDB:

FinishedTasksJobId - ключ раздела - идентификатор заданияFinishedRequestId - ключ сортировки - идентификатор завершенного запроса

Каждая лямбда-работа будет делать следующее:

  1. Читать новый элемент из потока
  2. Написать новый элемент в FinishedTasks
  3. Прочитайте все законченные задачи для идентификатора работы
  4. Проверьте, все ли задачи выполнены
  5. Если все задачи выполнены, делай то, что нужно

В этом случае у вас есть идемпотентная задача (не имеет значения, если вы дважды переопределите элемент в FinishedTasks)

Конечно, вам нужно удалить старые элементы из FinishedTasks. Можно использовать функцию TTL для автоматического удаления старых элементов.

Другие вопросы по тегам