API Gateway + Lambda чрезвычайно медленное время отклика - PullRequest
0 голосов
/ 20 декабря 2018

Я создаю серверную часть своего приложения, используя API-шлюз с функциями Lambda, и у меня возникают проблемы со временем ответа на запросы.

Уже известно, что функции Lambda имеют печально известную функцию "холодный старт "и хорошо, мы уже принимаем это.Но проблема, с которой я столкнулся, это новый холодный старт, на этот раз со стороны API Gateway.И это не несколько ms в режиме ожидания, это seconds (около 12-15 секунд).О боже, это большая проблема ...

Эта задержка ответа происходит на 12-15 секунд при первом запросе и после некоторого бездействия (примерно 1 час).

Мой вопрос:что может быть причиной этой задержки и как ее исправить?

Дополнительная информация:
Моя лямбда-функция настроена для работы на VPC.

Журналы CloudWatch отAPI-шлюз:

(01) Extended Request Id: XXXXX=
(02) Verifying Usage Plan for request: XXXXX. API Key: API Stage: XXXXX
(03) API Key authorized because method 'GET /XXXXX' does not require API Key. Request will not contribute to throttle or quota limits
(04) Usage Plan check succeeded for API Key and API Stage XXXXX/v1
(05) Starting execution for request:
(06) HTTP Method: GET, Resource Path:
(07) Method request path:
(08) Method request query string:
(09) Method request headers:
(10) Method request body before transformations:
(11) Endpoint request URI:
(12) Endpoint request headers:
(13) Endpoint request body after transformations:
(14) Sending request to XXXXX
(15) Received response. Integration latency: 14497 ms
(16) Endpoint response body before transformations:
(17) Endpoint response headers:
(18) Method response body after transformations:
(19) Method response headers:
(20) Successfully completed execution
(21) Method completed with status: 200
(22) AWS Integration Endpoint RequestId :
(23) X-ray Tracing ID : 

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Так что здесь нужно иметь в виду несколько вещей: холодный старт происходит, когда контейнер, в котором запускается Lambda, фактически «выведен из эксплуатации» - это означает, что инфраструктура AWS отказалась от «готовности» к тому, что «никто в действительности не использует это, давайтеотложите его ".

Лямбда вне VPC может иметь время холодного запуска до 6 секунд, ВНУТРИ ВИДЕО, на который вы можете смотреть в любом месте до 12 секунд на КОНТЕЙНЕР, так что только потому, что у вас есть один теплый экземпляр LambdaЕсли два человека достигнут этой конечной точки одновременно, то 2-й человек получит холодный старт.

Так как г-н Дашмуг направо предлагает назначенную функцию для разогрева лямбды, это простой способ, теперьСледует помнить одну вещь: ваша функция, вероятно, согревает 1 контейнер, если вы ожидаете сотни запросов в секунду, вам нужно поддерживать количество X контейнеров в тепле.

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

По сути, вам нужна функция, которая будет делать X количество одновременных запросов на конечную точку - учтите, что это обходится дорого, хотя вы можете поддерживать довольно приличный микросервис, как этот, менее чем за30 долларов в месяц.

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

Подумайте об этом, мое среднее время запросов для API, над которыми я работаю, составляет <400 мс - поэтому мне нужно 2 запроса в секунду, 120минуту, 7200 час, чтобы даже начинать нуждаться в двух контейнерах все время - если у вас есть что-то вроде приложения, в котором люди входят в систему, а затем позвоните в конечную точку API для домашнего экрана, вы можете сделать что-нибудь простое, например, Login-> SNS, инициирующее событие разогреваследующая конечная точка.

В основном, если вы знаете поток, который ваш соnsumer собирается вызывать API, вы можете предварительно разогревать конечные точки в зависимости от того, что было вызвано предыдущим.

0 голосов
/ 20 декабря 2018

API-шлюз не имеет холодных запусков, AFAIK.

Эта задержка после одного часа бездействия все еще остается холодным запуском Lambda.

Чтобы предотвратить это, вы можете создать запланированное событие CloudWatch для сохранениязвоните в ваш Lambda (например, каждые 5 минут), чтобы избежать бездействия и уменьшить холодные пуски.

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

...