AWS Lambda обрабатывает запросы, вызывая контейнеры. Если поступит новый запрос, и ни один контейнер не будет свободен, он будет ускорять использование нового контейнера, чтобы выполнить этот запрос. Однако, если был контейнер, который в настоящее время не обрабатывает какой-либо запрос, новый запрос будет перенаправлен в этот контейнер.
Таким образом, по сути, если используется один и тот же контейнер, вы получите тот же экземпляр синглтона. Однако, если для обслуживания запроса используется новый контейнер, вы получите новый одноэлементный экземпляр.
Вы можете легко проверить это, используя следующий код. Эта лямбда вызывается из шлюза API с прокси, а имя отправляется как параметр запроса с запросом GET. Добавлена задержка в 20 секунд, чтобы несколько выполнений могли выполняться в разных контейнерах.
import json
import time
class Singleton:
__instance = None
@staticmethod
def getInstance(name):
""" Static access method. """
if Singleton.__instance == None:
Singleton(name)
print(Singleton.__instance.name)
return Singleton.__instance
def __init__(self,name):
""" Virtually private constructor. """
if Singleton.__instance != None:
raise Exception("This class is a singleton!")
else:
self.name = name
Singleton.__instance = self
def lambda_handler(event, context):
# TODO implement
param = event.get("queryStringParameters")
s = Singleton.getInstance(param.get("name"))
time.sleep(20)
return {
'statusCode': 200,
'body': json.dumps(s.name)
}