Запуск лямбда на основе нескольких файлов - PullRequest
1 голос
/ 29 января 2020

Я немного сбит с толку, так как мне нужно запустить клейкое задание AWS, когда в s3 доступно несколько указанных файлов c. При каждом событии размещения файла в s3 я запускаю лямбду, которая записывает метаданные этого файла в DynamodB. Здесь, в DynamodB, я также поддерживаю счетчик, который подсчитывает количество необходимых файлов.

Но когда загружаются несколько файлов одновременно, что вызывает несколько лямбд, они записывают почти в одно и то же время в DynamodB, который воздействует на счетчик; следовательно, счетчик не может рассчитывать точно.

Мне нужен лучший способ начать работу, когда указанные c (несколько) файлов доступны в s3.

Пожалуйста, предложите лучший способ.

Ответы [ 3 ]

0 голосов
/ 29 января 2020

Звучит так, будто вы получаете текущий счетчик, увеличиваете его в своей функции Lambda, затем обновляете DynamoDB новым значением. Вместо этого вам нужно использовать DynamoDB Atomi c Counters , что гарантирует, что несколько одновременных обновлений не вызовут описываемые вами проблемы.

Используя счетчики Atomi c, вы просто отправляете DynamoDB запрос на увеличение вашего счетчика на 1. Если ваша Lambda должна проверить, был ли это последний файл, который вы ожидали, прежде чем выполнять другую работу, тогда вы можете используйте возвращаемое значение из вызова обновления, чтобы проверить, что является новым счетчиком.

0 голосов
/ 29 января 2020

Не уверен, что вы подразумеваете под "указанными c" (несколькими) файлами.

Если вы ожидаете указанных c имен файлов (или "шаблонов"), то вы можете просто проверить все ожидаемые файлы в качестве первой инструкции вашей лямбда-функции. Т.е. вы ожидаете файлы: A.txt, B.txt, C .txt, а затем проверьте, содержит ли ваша корзина s3 эти 3 специфических c файла (или 3 * .txt файла или что-либо еще, соответствующее вашим требованиям). Если это так, продолжайте обработку, если нет, то return из функции. Технически это будет работать в случае одновременных вызовов.

0 голосов
/ 29 января 2020

Динамо в конечном итоге соответствует по умолчанию. Вам необходимо запросить строго согласованное чтение, чтобы гарантировать, что вы читаете те же данные, которые были записаны.

См. эту страницу для получения дополнительной информации или для получения более конкретной информации. Например, смотрите флаг ConsistentRead в документах GetItem .

Стоит отметить, что это только минимизирует вашу проблему. Между чтением и записью также будет очень маленькое окно, из-за которого сетевая задержка заставляет одну функцию читать / писать, в то время как другая делает это. Вам следует подумать о том, чтобы одновременно разрешать запуск только одной функции или какой-либо другой логики c, чтобы гарантировать взаимоисключающий доступ к БД.

...