Об идемпотентности функции
В этом материале мы, в качестве одного из фундаментальных требований к построению современных облачных функций, рассмотрим понятие идемпотентности.
Идемпотентность является свойством определенных операций в математике и информатике, посредством которого обеспечивается неизменность результа при множественном применении этой операции.
Концепция идемпотентности возникает в ряде мест в линейной и абстрактной алгебре, а также в функциональном программировании (в котором оно связано со свойством ссылочной прозрачности - чистыми функциями)
Стоит упомянуть, что чистая функция - это детерминированная* функция не вызывающая побочных эффектов**.
* функция является детерминированной если для одного и того же набора входных значений она возвращает одинаковый результат
** функции с побочными эффектами модифицируют значения глобальных или внешних, (т.е. не из их лексического окружения) переменных или осуществляют операции ввода-вывода, либо же зависит от внешних обработчиков
Идемпотентный вызов функции — это операция, многократное повторение которой эквивалентно однократному.
Фоновые функции, которые открыты для механизма повторения, должны быть идемпотентными. Вот несколько общих рекомендаций по созданию идемпотентной фоновой функции:
Идемпотентность является свойством определенных операций в математике и информатике, посредством которого обеспечивается неизменность результа при множественном применении этой операции.
Концепция идемпотентности возникает в ряде мест в линейной и абстрактной алгебре, а также в функциональном программировании (в котором оно связано со свойством ссылочной прозрачности - чистыми функциями)
Стоит упомянуть, что чистая функция - это детерминированная* функция не вызывающая побочных эффектов**.
* функция является детерминированной если для одного и того же набора входных значений она возвращает одинаковый результат
** функции с побочными эффектами модифицируют значения глобальных или внешних, (т.е. не из их лексического окружения) переменных или осуществляют операции ввода-вывода, либо же зависит от внешних обработчиков
Идемпотентный вызов функции — это операция, многократное повторение которой эквивалентно однократному.
Способы достижения идемпотентности облачной функции
Фоновые функции, которые открыты для механизма повторения, должны быть идемпотентными. Вот несколько общих рекомендаций по созданию идемпотентной фоновой функции:
- Многие внешние API (такие как Stripe) позволяют указывать ключ идемпотентности в качестве параметра. Если вы используете такой API, вы должны использовать идентификатор события в качестве ключа идемпотентности.
- Идемпотентность хорошо работает с at-least-once delivery*, потому что она делает повторную попытку безопасной. Таким образом, в большинстве случаев лучшей практикой для написания надежного кода будет комбинация идемпотентности с операцией обеспечивающей повторные попытки при отказе.
- Убедитесь, что ваш код внутренне идемпотентен. Например:
- убедитесь, что мутации могут произойти более одного раза без изменения результата
- Запросите состояние базы данных в транзакции перед модификацией данных
- убедитесь, что все побочные эффекты также идемпотентны
- Гарантируйте транзакционную проверку вне функции, независимо от кода. Например, сохраняйте состояние где-то указывая, что данный идентификатор события уже обработан
- Рассмотрите работу с дублирующимися вызовами функций вне диапазона. Например, это может быть отдельный процесс, который производит очистку после повторных вызовов функций
* Паттерн согласно которому в случае сбоев, приводящих к потере сообщений или занимающих слишком много времени на восстановление от них, сообщения передаются повторно, чтобы обеспечить их доставку хотя бы единожды
Комментарии
Отправить комментарий