Шлюз API — это инструмент управления API, который находится между клиентом и набором бэкэнд-сервисов. С помощью шлюза API вы можете активировать лямбду AWS, но вот лямбда-вызов имеет максимальное время ожидания 15 минут, поэтому вы можете выполнять обработку для всего 15 минут, но в большинстве случаев это не проблема, настоящая проблема заключается в шлюзе API, где тайм-аут составляет всего 30 секунд, поэтому, если ваша лямбда обрабатывается более 30 секунд, вы не получите никакого ответа от шлюза API. .

Проблема

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

  1. Возьмите все URL-адреса и создайте набор этих ссылок.
  2. Загрузите каждое изображение с указанного URL-адреса и сохраните копию в S3.
  3. Обработайте каждый URL-адрес и создайте 5 разных копий с помощью модуля Sharp.
  4. Выполните дополнительную обработку, например удалите bg, если пользователь попросит об этом.

Для 10–20 изображений он отлично работал с API-шлюзом, но по мере увеличения количества изображений и изображений с более высоким разрешением это давало тайм-аут.

Решение

Чтобы оптимизировать описанный выше подход, я сделал 2 вещи.

Увеличение сложности пространства

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

Внедряя веб-сокеты

WebSocket — это протокол двунаправленной связи, который может отправлять данные от клиента к серверу или от сервера к клиенту.

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

Заключение

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

Надеюсь, вы поняли концепцию использования веб-сокетов с лямбдой AWS, если у вас есть какие-либо предложения, вы можете оставить комментарий. До скорой встречи и счастливого кодирования до тех пор! ❤