Лямбда-дросселирование с SNS - PullRequest
2 голосов
/ 19 июня 2019

Читая часть FAQ по SNS , касающуюся повторных попыток с использованием функций Lambda, я столкнулся со следующим утверждением:

В: Что происходит с Amazon SNSсообщения, если конечная точка подписки недоступна? Lambda: Если Lambda недоступна , SNS будет повторять попытки 2 раза с интервалом в 1 секунду, затем 10 раз экспоненциально откатываться от 1 секунды до 20 минут и, наконец,38 раз каждые 20 минут, всего 50 попыток в течение более 13 часов, прежде чем сообщение будет удалено из SNS.

Насколько мне известно, лямбда-функция реализует собственный механизм повторения для регулирования, как упомянуто в Лямбда-регулирование Bevaviour Documentation :

Асинхронный вызов: Если ваша функция Lambda вызывается асинхронно и регулируется , AWS Lambda автоматически повторяет событие регулирования до шести часов с задержками между повторными попытками.

Так что же происходит, когдафункция блокируется и появляется другое сообщение SNS?SNS рассматривает Lambda как «доступный» и прерывает механизм повторных попыток, позволяя Lambda автоматически повторять попытку, или продолжает повторять попытку доставки сообщения?

1 Ответ

1 голос
/ 20 июня 2019

Слово «доступно» относится к способности SNS связываться со службой Lambda и отправлять один запрос для вызова функции.

Ключ к пониманию этого требует, чтобы вы сначала знали, что SNS вызывает лямбда-функции асинхронно , а затем вы понимаете последствия этого.

Запрос асинхронного вызова не предоставляет никакой обратной связи вызывающей стороне (в данном случае SNS), независимо от того, была ли функция запущена немедленно или была ограничена, или она успешно выполнила или вызвала исключение.

SNS >> Lambda: "Hi, run this Lambda function asynchronously, with this payload."
Lambda >> SNS: "Okay, I received your request and will do that as soon as it is possible. Goodbye."

Абонент (SNS) не заботится о деталях, которые следуют ниже. После успешного выполнения запроса SNS завершает обработку этого сообщения, и теперь служба Lambda должна немедленно вызвать функцию и / или принять участие в задокументированном поведении Lambda Retry.

SNS фактически связывается со службой Lambda только один раз за сообщение. Когда он не может этого сделать, лямбда не «доступна». Это должно происходить очень, очень редко ... но если SNS не может установить контакт, то есть тогда, когда SNS участвует в поведении, описанном в FAQ по SNS, - пытается отправить запрос для вызова функции. Как только это будет выполнено, роль SNS будет завершена, а остальное будет обработано службой Lambda.

Каждое сообщение обрабатывается независимо через интеграцию SNS / Lambda, причем SNS обрабатывает каждое сообщение как можно скорее, при этом SNS не осознает, что вызовы функций впоследствии удушаются.

...