Как вызвать лямбду для каждого элемента в огромной таблице c - PullRequest
1 голос
/ 12 февраля 2020

У меня есть таблица динамодаба с почти 200 тысячами предметов. Мне нужно запустить лямбду для каждого элемента в нем (отправить каждый элемент в лямбда в качестве входных данных). Я хочу выполнить это для каждых x часов для всех элементов в таблице. Данные в таблице меняются каждые 5 дней или около того.

Есть ли способ без сервера автоматизировать извлечение всех элементов в лямбду через SQS, et c?

У меня не может быть лямбда для сканирования всей таблицы, так как лямбда - это слишком много для обработки (ограничение 300 секунд и т. д. c).

Спасибо, Винод.

Ответы [ 4 ]

1 голос
/ 12 февраля 2020

И сканирование, и изменение всех данных в Dynamodb неосуществимы.

Вы можете хранить все ключи DynamodB в кеше, например, Redis. Может быть отдельное задание, которое берет ключи из Redis и помещает их в sqs, где слушает лямбда. Ключи redis можно поддерживать в актуальном состоянии с помощью динамических потоков.

0 голосов
/ 13 февраля 2020

Я бы изучил SQS. Сделайте лямбда-выборку до 25 записей (максимум) в пакете, делайте то, что нужно, и помечайте записи (например, обновляя метку времени на них - используйте фильтр с меткой времени, чтобы убедиться, что ваши выборки всегда выбирают только те записи, которые нуждаются Обновление. Вы можете продолжать извлекать записи. В конце концов лямбда прекратит работу, но, поскольку она не завершилась sh, у вас не будет возможности пометить ваше задание SQS как выполненное путем удаления задания . Задания SQS имеют период видимости , который, когда он заканчивается, приводит к их повторному появлению в очереди, в результате чего лямбда запускает другой пакет, пока в конечном итоге лямбда не находит больше записей и может затем удалить задание SQS. Мы используем это для refre sh индексы эластичного поиска со всеми записями при изменении нашего отображения индекса.

0 голосов
/ 12 февраля 2020

Когда вы говорите, что хотите «сработать» для каждого элемента в нем, это не на 100% ясно, что вы имеете в виду. В общем, я думаю, что для этого потоки DynamoDB, но что-то должно вызывать обработку записей потоком. Это часто делается с помощью простого UpdateItem для каждой записи, устанавливая поле, которое, скорее всего, не является частью ваших данных, что-то вроде текущего времени или что-то еще уникальное. Оттуда вы получите каждую запись для обработки через лямбду, запущенную в потоке.

100% безсерверный путь к l oop через данные следующий:

  • Шаг Функция, которая вызывает лямбду для запуска пакета записей.
  • Лямбда-функция сканирует записи, просматривая страницы записей.
    • Функция должна принимать полезную нагрузку, которая дополнительно предоставляет информацию о подкачке.
    • Функция должна проверять лямбда-контекст, чтобы увидеть, сколько времени осталось до запуска каждого l oop и выхода, если его нет. достаточно времени для обработки пакета.
    • Функция для возврата информации о поисковом вызове (последняя оцененная клавиша)
  • Пошаговая функция проверяет, завершен ли вызов.
    • Если нет, то снова вызывается лямбда с информацией о подкачке.
    • Если конец завершен
0 голосов
/ 12 февраля 2020

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

Вариант 1 (Сканирование в лямбду небольшими партиями):

Вы упомянули, что если у вас есть проблемы с лямбдой, когда у вас недостаточно ресурсов для сканирования всех элементов в таблице, вы можете попробовать обработать данные небольшими порциями, чтобы избежать ограничения ресурсов. Максимальное время выполнения лямбды - 15 минут, которого должно хватить для большинства работ. (Обратите внимание, что в Lambda ЦП масштабируется с использованием памяти, поэтому в зависимости от задания на выделение памяти можно реально сэкономить деньги, сократив время, необходимое для выполнения функции.)

Вариант 2 (Запланированная задача ECS Fargate):

В ECS с помощью Fargate вы можете без сервера создавать задачи по расписанию cron. Если вас беспокоит ограничение ресурсов, вы можете выделить до 4 виртуальных ЦП и 32 ГБ памяти на задачу, что значительно снизит вероятность того, что вы достигнете ограничения ресурсов. Здесь - некоторая документация о том, как это настроить.

Вариант 3 (Обрабатывать элементы с использованием триггеров динамо):

Вы можете настроить свою таблицу динамо для запуска лямбда если данные в таблице вставлены , изменены или удалены , вы можете обрабатывать элементы по мере их поступления или изменения. Вы даже можете настроить их Пакетные изменения до 10 пунктов, чтобы уменьшить лямбда-вызовов. Здесь - ссылка на документацию.

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