Оригинальная статья здесь: https://dashbird.io/blog/why-your-lambda-functions-may-be-doomed-to-fail/
AWS Lambda имеет классную функцию, которая может быть как благословением, так и кошмаром для приложения без сервера, в зависимости от того, правильно ли обработано наш код: поведение повторной попытки.
Повторное повторение происходит, когда вызов функции лямбда приводит к ошибке, и платформа AWS Lambda автоматически вызывает функцию снова с тем же полезной нагрузкой на событие.
Прежде чем мы все глубже, убедитесь, что вы знакомы с AWS Документация на предмет.
Допустим, вы работаете на сайте электронной коммерции, а AWS Lambda используется для обработки заказов клиентов. Человек приобретает товар, и у вас есть функция, заботясь о следующих шагах, все в одном запуске:
- Убедитесь, что товар доступен в наличии
- Обработка кредитной карты
- Удаление предмета от насадок
- Отправка подтверждения электронной почты
Теперь рассмотрим первые три шага, успешно завершенные, но в отправке электронного письма появилась находья, и ваша заявка подняла ошибку. Платформа Lambda автоматически вызывает функцию снова с одинаковыми параметрами, и электронная почта успешно отправляется. Удивительно, не так ли?
Ну, не так быстро. Наша система только что зарегистрирована секунду, непреднамеренная покупка для одного и того же клиента … и заряжалась его кредитная карта дважды!
Хьюстон у нас проблема!
Редко Этот процесс будет реализован точно так, но он служит иллюстративным примером.
Поведение Rambda Retry на самом деле очень крутая особенность, не ошибайтесь. В распределенной системе многие вещи могут пойти не так. На самом деле, когда все может пойти не так, будьте уверены, что они Будет ли пойти не так в какой-то момент. AWS заботится о том, чтобы убедиться, что эти ошибки не остаются похороненными, и у операции есть еще несколько шансов на успех. Мы, наверняка не хотим пропустить доход продажи из-за технической проблемы.
Хорошо, мы видим ценность в поведении повторной попытки, но как мы можем избежать погрешных болей, таких как пример двойного заряда?
Есть концепция под названием Idempottence Это приходит к нашему спасению. Wikipedia определяет его как « свойство определенных операций по математике и компьютерной науке, в результате чего они могут быть применены несколько раз, не изменяя результат за пределы начального приложения ».
Хорошая практика для объединения с идемпотентностью является Разделение опасений Отказ В предыдущем примере у нас было несколько разных операций, связанных вместе. Если возможно, было бы хорошо иметь разные функции, заботясь о каждой операции. Одной из причин является то, что идемпотентность должна быть проанализирована и реализована с точки зрения операции.
Прочитанные операции обычно не дают никаких побочных эффектов, они идемпотентны по природе. В нашем примере операция № 1 (проверьте, доступный ли элемент в наличии) будет примером этого. В большинстве случаев вам не нужно беспокоиться об этом, поэтому их реализовано отдельно, сделает легче управлять остальной частью вашего стека.
Хранение и удаление значения не являются идемпотентными операциями по природе, но они могут быть Если у нас есть уникальный идентификатор (UID) для этого ресурса. В нашей сценарии электронной коммерции, если заказ клиента имеет UID, операция хранения может быть выполнена несколько раз без создания нескольких различных размещений заказа.
Заказ UID может быть, например, хэш электронной почты клиента или имени пользователя, метки покупки и список приобретенных предметов. Эти переменные будут отправлены в качестве параметра на нашу API, когда сайт получает запрос заказа. Если функция не удалась в какой-то момент, и вызов повторяется, один и тот же заказ UID будет снова сгенерирован, отвечающий требованию IDEMPottency. Опять же, Это только для иллюстрации — Каждое обстоятельство потребует надлежащего анализа, чтобы найти стабильную и устойчивую реализацию IdEmpotent.
Для деталей зарядки кредитной карты большинство платформ будут поддерживать idempotent запросы. Полоса Например, предоставит Keypotentency Key Так что вы можете безопасно повторить запрос, если что-то пойдет не так в транзите.
Обычно, если операция проходит в царстве вашего стека, она будет полностью на ваших руках, чтобы соответствовать требованиям IDEMPottency. Уникальный принцип идентификатора, объясненный выше, обычно будет достаточно. Но если вы полагаетесь на сторонние API, это может быть сложно обеспечить идемпотентность, и вам может потребоваться помощь с другой стороны, чтобы выполнить эту цель, если такая работа не поддерживается из коробки. Если вы не можете заставить третью сторону работать с вами, всегда есть возможность сначала выполнить все операции на вашем концом, создать отдельный процесс для проверки, успешно ли все работает, затем взаимодействуют с внешним API. Это не было бы идеальной реализацией, но может быть так же хороша, как можно получить в некоторых обстоятельствах.
Разработчик Severless нуждается в инструменте, который автоматически идентифицирует, когда вызов на самом деле является повторением из предыдущего выполнения. Вот почему мы создали Dashbird и предложить это бесплатно Для всех неверных разработчиков. Первое исполнение и последующие попытки связаны нашей системой, поэтому они легко судоходны. Это делает его намного проще понять, почему функция не удалась, и реализация стратегии IDEMPotency работает должным образом.
Оригинал: «https://dev.to/dashbird/why-your-lambda-functions-may-be-doomed-to-fail-1l00»