场景:
Теперь нам нужно разработать приложение с разделением фронтенда и бэкенда.Удобнее всего использовать RESTful API для бэкенда.Однако, если у этого бэкенд-сервиса будет высокий параллелизм в определенное время суток, какую архитектуру проще всего использовать?
Когда я впервые подумал об этой проблеме, решения, которые пришли мне в голову, могут быть следующими:
-
Используйте сеть распространения контента CDN, чтобы уменьшить нагрузку на главный сервер
-
Балансировка нагрузки с использованием серверов LVS
-
использовать кеш
-
Аппаратный уровень Увеличьте пропускную способность, используйте жесткие диски SSD, используйте лучшие серверы
-
Слои кода, оптимизация кода (использование более эффективных языков и т. д.).
Однако во всех вышеперечисленных методах необходимо обращать внимание на ресурсы хранения и вычислительные ресурсы сервера, чтобы их можно было в любой момент скорректировать для достижения более высокой производительности, а высокие одновременные запросы также делятся на периоды.
В настоящее время можно использовать архитектуру FaaS (функции как услуга). В отличие от традиционных архитектур, они работают в контейнерах без сохранения состояния и могут запускаться событиями. Они недолговечны и полностью управляются третьими сторонами. Функционально FaaS не нужно заботиться о фоне Сервер или служба приложений, вам нужно заботиться только о своем собственном коде. Среди них AWS Lambda — одна из лучших реализаций FaaS.
AWS Lambda
AWS Lambda — это вычислительный сервис, который можно использовать для запуска кода без выделения серверов или управления ими. AWS Lambda выполняет код только при необходимости и автоматически масштабируется. С помощью AWS Lambda вы можете запускать код практически для любого типа приложений или серверных служб без какого-либо администрирования. AWS Lambda теперь поддерживает Node.js, Java, C# и Python.
сцены, которые будут использоваться
Общие сценарии применения Lambda следующие:
- Используйте Lambda в качестве источника событий для сервисов AWS (например, после загрузки аудио в s3 активируйте сервис транскодирования аудио Lambda для перекодирования аудиофайлов).
- Вызов функции Lambda по запросу через HTTPS (Amazon API Gateway) (создание простого микросервиса с помощью API Gateway)
- Вызов функции Lambda по запросу (создайте собственный источник событий с помощью пользовательского приложения)
- Запланированные события (например, формирование отчета в 12:00 каждую ночь и отправка его на указанный почтовый ящик
На следующем рисунке показана блок-схема выполнения с использованием Lambda в качестве источника событий для сервисного случая AWS:
- Пользователь загружает объект в корзину S3 (событие создания объекта).
- Amazon S3 обнаружил событие создания объекта.
- Amazon S3 вызывает функцию Lambda, указанную в конфигурации уведомлений корзины.
- AWS Lambda выполняет функцию Lambda, принимая роль выполнения, которую вы указали при создании функции Lambda.
- Выполнение лямбда-функции.
В этой статье основное внимание уделяется использованию Lambda в качестве источника событий для сервисов AWS и созданию простых микросервисов с помощью API Gateway.
Как использовать Лямбду
Далее мы будем использовать случай, чтобы представить, как использовать Lambda.
Использование AWS Lambda с Amazon API Gateway (по запросу и через HTTPS)
Шаг 1. Настройте свою учетную запись AWS и интерфейс командной строки AWS
- Зарегистрируйте учетную запись AWS и создайте пользователя-администратора в этой учетной записи.
- Настройка интерфейса командной строки AWS (AWS CLI)
Шаг 2. Создайте лямбда-функцию HelloWorld и исследуйте консоль
Создайте лямбда-функцию Hello World
- Войдите в Консоль управления AWS и откройте консоль AWS Lambda.
- выберитеGet Started Now. (Консоль отображается только в том случае, если функция Lambda не была создана.Get Started Nowстраница. Если вы создали функцию, вы увидитеLambda > Functionsстраница. На странице списка выберитеCreate a Lambda functionперейти кLambda > New functionстраница. На картинке ниже случай
- Здесь выберите создание с нуля, введите имя функции, выберите роль и нажмите «Создать функцию».
- Настройте созданную лямбда-функцию
Следует отметить, что часть обработчика — это имя файла кода + имя функции в файле, здесь имя нашего файла — lambda_function, имя функции — lambda_handler, а часть обработчика заполняется как lambda_function.lambda_handler.
- Добавляем триггер, здесь выбираем API Gateway, выбираем ранее настроенный API в разделе конфигурации и нажимаем Add. затем сохраните функцию
Протестируйте AWS Lambda + Amazon API Gateway
Войдите в консоль aws, откройте API Gateway, выберите только что выбранный API, нажмите «Тестировать», и мы увидим следующий вывод.
Подробности см. в официальной документации (https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/getting-started.html).
Выполнив описанные выше шаги, мы увидели, как использовать лямбда-функцию, теперь давайте посмотрим, как создать лямбда-функцию.
Как построить Лямбду
Создайте лямбда-функцию
При создании лямбда-функции необходимо указатьобработчик(Этот обработчик представляет собой функцию в коде), которую AWS Lambda может вызывать, когда сервис выполняет код. При создании функций-обработчиков в Python используйте следующие общие синтаксические конструкции.
def handler_name(event, context):
...
return some_value
В этом синтаксисе необходимо отметить следующие аспекты:
-
event
— AWS Lambda использует этот параметр для передачи данных события обработчику. Этот параметр обычно Pythondict
тип. это также может бытьlist
,str
,int
,float
илиNoneType
тип. -
context
— AWS Lambda использует этот параметр для предоставления обработчику информации о времени выполнения. Этот параметрLambdaContext
тип. -
(Необязательно) Обработчик может возвращать значение. Что происходит с возвращаемым значением, зависит от типа вызова, используемого для вызова функции Lambda:
-
При использовании
RequestResponse
Тип вызова (синхронное выполнение), результатом будет вызов функции AWS Lambda Python, возвращаемый вызывающему клиенту функции Lambda (HTTP-ответ на запрос вызова, сериализованный как JSON). Например, консоль AWS Lambda используетRequestResponse
тип вызова, поэтому при вызове функции с помощью консоли консоль будет отображать возвращаемое значение.если обработчик возвращает
NONE
, AWS Lambda вернет значение null. -
При использовании
Event
тип вызова (асинхронное выполнение), значение отбрасывается.
-
объект контекста
Когда выполняется функция лямбда, она может взаимодействовать с помощью службы AWS Lambda для получения полезной информации о времени выполнения, такой как:
- Время, оставшееся до того, как AWS Lambda прекратит выполнение вашей функции Lambda (время ожидания — это одно из свойств конфигурации функции Lambda).
- Группа журналов CloudWatch и поток журналов, связанные с выполнением функции Lambda.
- Идентификатор запроса AWS возвращается клиенту, вызвавшему функцию Lambda. С помощью этого идентификатора запроса можно направлять любые последующие запросы в службу поддержки AWS.
- Если вы вызываете функции Lambda через AWS Mobile SDK, вы можете узнать больше о мобильных приложениях, которые вызывают функции Lambda.
Методы объекта контекста (Python)
Объект контекста предоставляет следующие методы:
get_remaining_time_in_millis()
Возвращает время выполнения в миллисекундах, оставшееся до завершения AWS Lambda функции.
Свойства объекта контекста (Python)
Объект контекста предоставляет следующие свойства:
function_name
Имя выполняемой функции Lambda.
function_version
Версия выполняемой функции Lambda. Если псевдоним используется для вызова функции,function_version
Версия, на которую будет указывать псевдоним.
invoked_function_arn
ARN используется для вызова этой функции. Это может быть функция ARN или псевдоним ARN. Неквалифицированное выполнение ARN$LATEST
версии псевдоним выполняет версию функции, на которую он указывает.
memory_limit_in_mb
Предел памяти (в МБ), настроенный для функции Lambda. Вы устанавливаете лимит памяти при создании лямбда-функции, и вы можете изменить этот лимит позже.
aws_request_id
Идентификатор запроса AWS, связанный с запросом. Это обратно к звонкуinvoke
Идентификатор клиента метода. Обратите внимание, что идентификатор запроса остается прежним, если AWS Lambda повторяет вызов (например, если функция Lambda, обрабатывающая запись Kinesis, создает исключение).
log_group_name
Имя группы журналов CloudWatch, в которой можно найти журналы, записанные функцией Lambda.
log_stream_name
Имя потока журналов CloudWatch, из которого можно найти журналы, записанные функцией Lambda. Поток журнала может меняться или не меняться при каждом вызове функции Lambda. Это значение пусто, если функция Lambda не может создать поток журнала. Это может произойти, если роль выполнения, предоставляющая необходимые разрешения для функции Lambda, не включает разрешения на операции CloudWatch Logs.
identity
Информация о поставщике удостоверений Amazon Cognito при выполнении вызовов через AWS Mobile SDK. Он может быть пустым. identity.cognito_identity_ididentity.cognito_identity_pool_id
client_context
Информация о клиентских приложениях и устройствах при совершении звонков через AWS Mobile SDK. Он может быть пустым. client_context.client.installation_idclient_context.client.app_titleclient_context.client.app_version_nameclient_context.client.app_version_codeclient_context.client.app_package_nameclient_context.custom пользовательского значения, установленного мобильным клиентским приложениемdict
. client_context.env Контекстная информация, предоставляемая AWS Mobile SDK.dict
.
Пример
Посмотрите следующий пример Python. У него есть функция, эта функция также является обработчиком. Обработчик передается как параметрcontext
Объекты получают информацию о времени выполнения.
from __future__ import print_function
import time
def get_my_log_stream(event, context):
print("Log stream name:", context.log_stream_name)
print("Log group name:", context.log_group_name)
print("Request ID:",context.aws_request_id)
print("Mem. limits(MB):", context.memory_limit_in_mb)
# Code will execute quickly, so we add a 1 second intentional delay so you can see that in time remaining value.
time.sleep(1)
print("Time remaining (MS):", context.get_remaining_time_in_millis())
Код обработчика в этом примере выводит только часть информации о времени выполнения. Каждый оператор печати создает запись журнала в CloudWatch. Если вы используете консоль Lambda для вызова функции, консоль отображает журналы.
протоколирование
Ваша функция Lambda может содержать операторы регистрации. AWS Lambda записывает эти журналы в CloudWatch. Если вы используете консоль Lambda для вызова функции Lambda, консоль отображает те же журналы.
Следующие операторы Python генерируют записи журнала:
-
print
утверждение. -
logging
в модулеLogger
функцию (например,logging.Logger.info
иlogging.Logger.error
).
print
иlogging.*
функция записывает журналы в журналы CloudWatch, аlogging.*
Функция записывает в каждую запись журнала дополнительную информацию, такую как метка времени и уровень журнала.
Найти журналы
Журналы, записанные функцией Lambda, можно найти следующим образом:
-
В консоли AWS Lambda — эти журналы отображаются в разделе **Вывод журнала** в консоли AWS Lambda.
-
В заголовках ответов, когда вы программно вызываете лямбда-функцию — если вы программно вызываете лямбда-функцию, вы можете добавить
LogType
для получения последних 4 КБ данных журнала, записанных в журналы CloudWatch. AWS Lambda отвечаетx-amz-log-results
Информация журнала возвращается в заголовке. Для получения дополнительной информации см.Invoke.Если вы используете интерфейс командной строки AWS для вызова функции, вы можете указать значение с помощью
Tail
из--log-type parameter
для получения той же информации. -
В журналах CloudWatch. Чтобы найти журналы в CloudWatch, необходимо знать имя группы журналов и имя потока журналов. Вы можете использовать код в
context.logGroupName
иcontext.logStreamName
свойства для получения этой информации. При запуске функции Lambda журналы, созданные в консоли или CLI, будут отображать имя группы журналов и имя потока журналов.
функциональная ошибка
Если функция Lambda выдает исключение, AWS Lambda распознает сбой, сериализует информацию об исключении в JSON и возвращает ее. Рассмотрим следующий пример:
def always_failed_handler(event, context):
raise Exception('I failed!')
При вызове этой функции Lambda возникает исключение, и AWS Lambda возвращает следующее сообщение об ошибке:
{
"errorMessage": "I failed!",
"stackTrace": [
[
"/var/task/lambda_function.py",
3,
"my_always_fails_handler",
"raise Exception('I failed!')"
]
],
"errorType": "Exception"
}
Подробную информацию см. в официальной документации: https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/lambda-app.html.
Меры предосторожности
Лямбда-лимиты AWS
AWS Lambda накладывает ограничения на использование, такие как размер пакета или объем памяти, выделяемой функции Lambda при каждом вызове.
Ограничение ресурсов AWS Lambda на вызов
ресурс | ограничение |
---|---|
диапазон выделения памяти | Мин. = 128 МБ / Макс. = 1536 МБ (с шагом 64 МБ).Если максимальное использование памяти превышено, вызов функции прекратится. |
Временная емкость диска (пространство «/tmp») | 512MB |
количество файловых дескрипторов | 1024 |
Количество процессов и потоков (всего вместе взятых) | 1024 |
Максимальное время выполнения одного запроса | 300 секунд |
InvokeРазмер полезной нагрузки тела запроса (вызов RequestResponse/Sync) | 6MB |
InvokeРазмер полезной нагрузки тела запроса (событие/асинхронный вызов) | 128 K |
Ограничения для аккаунтов AWS Lambda по регионам
ресурс | ограничение по умолчанию |
---|---|
Количество одновременных исполнений | 1000 |
Параллельное выполнение относится к количеству выполнений кода вашей функции в любой момент времени. Однако вы можете оценить количество одновременных выполнений, однако в зависимости от того, обрабатывает ли функция Lambda события из источников событий на основе потока, количество одновременных выполнений различается.
-
Поиск событий на основе потоков- Если вы создаете лямбда-функцию для обработки событий из службы на основе потоков (Amazon Kinesis Data Streams или DynamoDB streams), количество секций на поток является единицей параллелизма. Если в вашем потоке 100 активных разделов, одновременно будет выполняться не более 100 вызовов функции Lambda. Затем каждая функция Lambda обрабатывает события в том порядке, в котором были получены разделы.
-
не потоковые источники событий- Если вы создаете функцию Lambda для обработки событий из источников событий, которые не основаны на потоках (например, Amazon S3 или API Gateway), каждое опубликованное событие является единицей работы. Таким образом, количество событий (или запросов), опубликованных этими источниками событий, влияет на степень параллелизма.
Вы можете использовать следующую формулу для оценки количества одновременных вызовов функции Lambda.
events (or requests) per second * function duration
Например, рассмотрим функцию Lambda, которая обрабатывает шлюз API. Предположим, что функция Lambda занимает в среднем 0,3 секунды, а шлюз API делает 1000 запросов в секунду. Следовательно, функция Lambda имеет 300 одновременных исполнений.
Для получения конкретной информации см.Лямбда-функции выполняются параллельно
**Ограничения на развертывание AWS Lambda **
проект | ограничение по умолчанию |
---|---|
Размер пакета развертывания функции Lambda (сжатые файлы .zip/.jar) | 50 MB |
Общий размер всех пакетов развертывания, которые можно загрузить для каждого региона. | 75GB |
Размер кода/зависимостей, которые можно сжать в пакет развертывания (размер несжатого файла .zip/.jar). Обратите внимание, что каждая функция Lambda будет указана в своем/tmp Каталог получил дополнительные 500 МБ непостоянного дискового пространства. Должен/tmp Каталоги можно использовать для загрузки дополнительных ресурсов, таких как библиотеки зависимостей или наборы данных, во время инициализации функции. |
250MB |
Общий размер набора переменных среды | 4 KB |
Содержание этой статьи в основном относится к официальной документации AWS Lambda. Подробную информацию можно найти на странице https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/welcome.html.
Ссылка на ссылку
Начало работы с AWS Lambda Development
Создайте пакет развертывания (Python)
Лямбда-функции выполняются параллельно
решение с высокой степенью параллелизма
Как оптимизировать высокий одновременный доступ к веб-сайту?
решение с высокой степенью параллелизма
Идеи программирования для бессерверной разработки
Пример простой бессерверной архитектуры
Архитектурные преимущества использования лямбда-выражений
Наконец, поблагодарите мою подругу за ее поддержку.
Добро пожаловать в подписку (April_Louisa) | купи мне фанту |
---|---|