Постепенная загрузка файлов AWS S3, сгенерированных лямбда-функцией

#javascript #node.js #amazon-web-services #amazon-s3 #aws-lambda

#javascript #node.js #amazon-веб-сервисы #amazon-s3 #aws-lambda

Вопрос:

У меня есть сайт, на который пользователь может загрузить изображение. Изображение загружается в корзину S3, затем обрабатывается с помощью функции Lambda, которая генерирует 7 различных цветных версий изображения, сохраняет их в корзине S3, и в конечном итоге функция возвращает URL-адреса новых цветных изображений пользователю, чтобы он мог выбрать предпочитаемый цвет на сайте.

Этот процесс занимает некоторое время, около 5-6 секунд при хорошем соединении, в течение которого пользователь может видеть только экран загрузки. Поскольку это возможно только при одном обратном вызове из lambda, как бы я мог «отложить загрузку» 7 изображений разного цвета вместо того, чтобы иметь экран загрузки? Я хотел бы иметь что-то вроде скелетного пользовательского интерфейса, который постепенно загружает изображения разных цветов, как только каждое из них сгенерировано, вместо того, чтобы ждать их все. Возможно ли это?

Ответ №1:

Лучшим подходом может быть возврат URL-адресов немедленно, до фактического создания изображений, поскольку целевые URL-адреса будут известны. Это может быть сделано путем вызова лямбда-функцией другого лямбда-выражения для выполнения фактической обработки, а затем немедленного возврата URL.

Затем веб-приложение может пытаться извлекать изображения каждые несколько секунд.

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

Комментарии:

1. Спасибо! URL-адрес фактически уже создан на серверной части и является частью полезной нагрузки (Lambda вызывается с помощью PHP через AJAX), поэтому я бы уже знал URL-адрес до вызова функции Lambda. Есть ли какой-либо способ избежать опроса и получить какой-либо триггер после завершения каждого изображения? Лямбда-функции сначала необходимо загрузить изображение из S3, прежде чем она сможет генерировать изображения, будет ли по-прежнему иметь смысл запускать несколько процессов или каждому процессу потребуется загрузить изображение и, следовательно, потребуется дополнительное время? Я обязательно рассмотрю многопоточность, это звучит интересно.

2. Единственное, что будет отправлено обратно на страницу, — это ответ от вызова лямбда-функции, и это может произойти только один раз (при завершении функции).

3. Ок, достаточно ясно, рассмотрю подход, описанный выше, большое спасибо!