Ваш дизайн может выглядеть следующим образом:
- S3 Bucket имеет триггер события objectCreated (настройка в разделе уведомлений корзины S3), который запускает Lambda для обработки
- Файлы загружаютсяв S3 Bucket
- Каждый файл запускает лямбду для его обработки (параллельные лямбды, поэтому это не последовательный
- Если лямбда сталкивается с ошибкой, он может уведомить пользователя (см. примечание ниже для решения этой проблемы)
- Как только Lambda завершит обработку, она может делать все, что вы пожелаете (например, отправлять результаты по электронной почте через SES или сохранять полученный файл в S3)
Я не хочу, чтобы службы выполняли последовательные операции
Когда вы используете AWS Lambda, которая не требует сервера, ваша Lambda будет запускать несколько одновременных экземпляров (которые можно ограничить и/ или зарезервировать, используя зарезервированное значение одновременных выполнений).
Предположим, что user1 и user2 запросили статус своего запроса
To sВ дополнение к этому, вы можете захотеть реализовать DynamoDB, который содержит статус каждого запроса.Когда лямбда запускается, она может записать в DynamoDB со статусом «в процессе», который затем может быть обновлен до «выполнено» или «не выполнено» соответственно.Тогда у вас будет отдельный API, который читает эту таблицу всякий раз, когда пользователь запрашивает обновление
Как я могу уведомить пользователя, если запрос не выполняется между ними?
Вы можете загрузитьфайл с префиксом, который содержит электронную почту пользователя или любой другой носитель уведомлений, например: files/userA/userA@test.com/file.doc
.Таким образом, когда лямбда запускается и начинает обработку, если она не обрабатывается, она знает, на какую электронную почту отправить результат.
Редактировать: На основании комментария, если вы хотите приближениягде файл уже присутствует в S3, и пользователь запрашивает обработку, затем просто отправляет сообщения пользователя в очередь SQS и затем имеет для него лямбда-триггер (он будет запускать параллельные выполнения Lambdas для обработки очереди, а не последовательные).Или вы могли бы сделать так, чтобы API напрямую вызывал Lambda, а затем заставлял пользователя ждать (если обработка относительно быстрая, это тоже подойдет)