#python #aws-lambda
#python #aws-lambda
Вопрос:
У меня есть запланированное событие, которое запускает лямбду каждые две минуты в определенные часы. Большую часть времени он from file import lambda_handler
поддерживает один и тот же сеанс python. А именно, глобальные переменные сохраняются между запусками.
Каждые несколько часов (не последовательно) он повторно инициирует сеанс python. Это приводит к странной схеме, причину которой я не мог понять. Есть ли?
Комментарии:
1. Вы никогда не должны рассчитывать на сохранение состояния лямбда-функции между запусками.
2. Правда, на это не стоит рассчитывать , но важно понимать, что это может произойти и происходит, поэтому вы можете воспользоваться этим и избежать потенциальных ошибок. Итак, к тому же моменту вам не следует рассчитывать на то, что состояние будет обновляться при каждом вызове.
3. Я не рассчитываю на это. Но это вызывает небольшие проблемы. Это интересный вопрос, когда я должен сериализовать вещи для сохранения состояния (соображения производительности), так как это не слишком ужасно, если оно не сохраняется.
Ответ №1:
То, что вы наблюдаете, — это артефакт «холодного запуска» и «теплого запуска» в AWS Lambda. Когда функции вызываются с интервалом в короткий промежуток времени друг от друга, они могут (или не могут) повторно использовать один и тот же рабочий контейнер; это теплое начало.
Теплые запуски помогают оптимизировать время выполнения. В этом случае глобальные объекты повторно используются для оптимизации таких вещей, как подключения к базе данных или аналогичные действия. При холодном запуске запускается полностью новый контейнер, что означает, что в памяти нет существующего состояния. Холодный запуск также занимает несколько больше времени, поскольку он должен снова загружать среду выполнения.
В следующем фрагменте кода CONNECTION
объект является глобальным. Функция-обработчик проверяет, был ли CONNECTION
он уже создан, и, если да, он не пытается создать новый. Если бы вы вызывали такую функцию много раз за короткий период и просматривали вывод журнала для такой функции, вы бы увидели, что она часто повторно использует соединение.
logger.info('Cold Start')
CONNECTION = None
def my_handler(event, context):
global CONNECTION
if CONNECTION is None:
logger.info('Initializing Connection')
CONNECTION = make_connection()
else:
logger.info('reusing existing connection!')
with CONNECTION:
... # do something
Не существует установленного периода времени, в течение которого будет выполняться «теплый запуск», и нет никакой гарантии, что вызовы функций будут «теплым запуском», даже если они вызываются близко по времени.Служба Lambda пытается решить, следует ли разумно поддерживать функции в тепле на основе шаблонов вызовов.
В некоторых бессерверных фреймворках, таких как zappa, существуют конфигурации, которые периодически вызывают функцию (скажем, каждые 4 минуты), чтобы попытаться сохранить ее теплой, чтобы при следующем вызове, скажем, веб-запроса, не было затрат на холодный запуск.
Дальнейшее чтение:
https://medium.com/capital-one-tech/best-practices-for-aws-lambda-container-reuse-6ec45c74b67e
Комментарии:
1. Спасибо. Интересно, что, вопреки их заявлениям о плагине для прогрева (он сохраняет тепло), моя 2-минутная лямбда через несколько часов становится холодной.
2. Да. Сохранение тепла — это наилучшая попытка. Тем не менее, это несколько предсказуемо, если ваш шаблон вызова остается неизменным на протяжении всего срока службы функции, в результате того, как AWS реализует эту функцию «теплого запуска». Тем не менее, нет никаких гарантий в отношении реализации AWS в отношении того, будет ли новый вызов теплым началом или нет. У вас также могут возникать проблемы с запуском по другим причинам, таким как одновременные вызовы или причины, о которых мы не знаем за кулисами, например, из-за того, что базовые хосты загружены, переработаны или становятся неработоспособными.