Вопрос или проблема
У меня есть API-lambda, который вызывается из API Gateway. Некоторые маршруты выполняют тяжелые запросы, и я заметил, что когда я отменяю вызов API с фронтенда, lambda продолжает выполнение.
Lambda реализована на Go, и я пытался использовать контекст, который я получил из функции обработчика lambda, чтобы остановить запрос к базе данных, но он завершил выполнение так, как будто ничего не произошло.
В базовом AWS Lambda нет прерываний, кроме таймаута. Когда вы изучаете API времени выполнения Lambda, вы увидите, что он получает следующий запрос из конечной точки .../next
и отправляет результат на конечную точку .../response
(или .../error
), между ними нет взаимодействия.
Вы могли бы написать расширение, но, возможно, будет проще разбить тяжелые запросы на более мелкие части и использовать что-то вроде Step Functions, который имеет StopExecution
.
Ответ или решение
Когда вы работаете с AWS Lambda и API Gateway, важно понимать, что каждая Lambda-функция обрабатывается независимо, и этот процесс не может быть прерван, когда вызов уже начат. Это значит, что даже если клиент отменяет запрос с фронтенда, Lambda-функция продолжит свою работу до завершения, если не наступит время ожидания.
Решение проблемы
-
Использование контекста: Ваша Lambda-функция получает объект контекста, который можно использовать для сброса состояния, но, как вы заметили, это не остановит сам процесс выполнения. Вы можете использовать его для определения оставшегося времени функции и выполнения неполных операций, но прервать уже запущенные операции, такие как тяжелые запросы к базе данных, не получится.
-
Микросервисная архитектура: Подумайте о разделении тяжелых операций на более мелкие, управляемые процессы. Это может быть реализовано с помощью AWS Step Functions. Они позволяют разделить сложные задачи на более простые шаги и включают возможности для остановки выполнения с помощью API
StopExecution
. -
Авансовые проверки на завершение: Если ваша логика обработки позволяет это, добавьте проверочные механизмы, которые будут проверять, нужно ли продолжать выполнение. Например, вы можете использовать Redis или DynamoDB для хранения статуса выполнения запроса. Всякий раз, когда запрос начинает обработку, он может записать статус в базу данных, а затем в процессе работы проверять, нет ли изменений в статусе (например, отмена).
-
Параллельные запросы: Если ваши тяжелые операции позволяют, вы можете их разбивать на несколько параллельных запросов, выполненных в контексте Step Functions. Клиент может отменить основной запрос, который управляет этими подзадачами, и вы можете эффективно контролировать все подзадачи, включая возможность их остановки.
-
Обработка таймаутов и исключений: Убедитесь, что ваша Lambda-функция корректно обрабатывает таймауты и исключения. Возможно, стоит установить разумное значение таймаута функции, чтобы избежать долгих блокировок, если запросы действительно тяжелые.
Заключение
К сожалению, Lambda-функции спроектированы таким образом, что они не будут автоматически реагировать на отмену запросов с клиентской стороны. Однако применив стратегию разбиения задач на более мелкие части и использовав более продвинутые AWS-сервисы, такие как AWS Step Functions, вы сможете улучшить управление выполнением и обрабатывать любые отмены более эффективно.