«Форк и соединение» с функциями без сервера (например, AWS Lambda) / Python

1

Я обрабатываю относительно большие изображения с помощью AWS Lambda (https://registry.opendata.aws/sentinel-2/).

Чтобы обработать эти изображения, я разделил их на более мелкие изображения (~ 1500 "фишек"), которые можно обрабатывать независимо (количество фишек непредсказуемо варьируется в зависимости от содержимого исходного изображения). Чипы обрабатываются параллельно с использованием нескольких вызовов лямбды, которая занимает "страницу" из нескольких сотен фишек.

Вот где я застрял: когда все страницы обработаны, мне нужно объединить результаты в одно выходное изображение, но как узнать, когда все страницы - "переменная партия вызовов" - завершены?

Я рассмотрел, например, запись информации о прогрессе в s3 или динамо и вызов функции объединения после каждой страницы, так что выполняется только последний вызов этой функции (когда проверка выполнения возвращается как завершенная). Я видел такие варианты, как фьючерсы/обещания, но время обработки страницы чипов составляет порядка 10-15 минут, поэтому я не хочу оставлять функцию "контроллера" в ожидании завершения фьючерсов/обещаний, потому что в этот момент дешевле идти с несколькими вызовами.

Есть ли лучшее решение, которое выписывает информацию о прогрессе и проверяет ее несколько раз?

(NB я видел этот вопрос: Форк и Присоединиться с Amazon Lambda)

Теги:
amazon-web-services
aws-lambda

1 ответ

1

Вы можете добавить микросхемы в очередь с помощью Amazon SQS, и работники или Lambdas будут вытаскивать эти отдельные задания из очереди. Затем вы можете настроить оповещение cloudwatch, которое контролирует глубину вашей очереди, где нулевая глубина очереди (задание выполнено) запускает лямбду "завершения", которая объединит отдельные выходные микросхемы.

Я полагаю, что CloudWatch предупреждает о состоянии очереди опроса с 5-минутными интервалами, поэтому для вашего случая использования, когда у вас есть длительное время обработки (~ 10-15 минут), это не будет узким местом (лямбда-тайм-ауты в любом случае 15 минут, так что если Вы установили опрос на 15 минут, ваша лямбда либо не прошла, либо будет завершена к тому времени).

Шаг за шагом, как это будет выглядеть:

  1. Загрузить новый файл на S3
  2. Загрузка запускает лямбду, чтобы разбить файл на "фишки" в новой папке
  3. Добавить все фишки в новую очередь
  4. Лямбды снимают чипсы с очереди
  5. когда очередь пуста, запускается конгломерация лямбда

Вот еще один полезный ответ по настройке триггеров на основе состояния очереди: эффективный способ проверить, пуста ли очередь SQS

Ещё вопросы

Сообщество Overcoder
Наверх
Меню