"Что такое идемпотентность?"
Мне казалось, что это очень частый вопрос для системных аналитиков, а вот разрабов как будто реже само определение спрашивают.
Хотя знакомый понимал смысл термина, готовой формулировки у него не было, начал объяснять, немного запутался. Ему повезло с собеседующим, тот послушал объяснение и понял, что человек ориентируется в теме, даже помог наводящими вопросами.
Но я тоже сталкивалась, когда на этот вопрос отвечают не совсем то, что нужно. Давайте разберемся с этим определением.
❌ Идемпотентность - это когда при повторных запросах приходит один и тот же ответ.
Нет, дело тут не в ответах, они могут отличаться.
Классический пример с DELETE: первый запрос на удаление может вернуть 200, а следующий - 404, при этом метод остается идемпотентным.
Или другой пример:
Идемпотентный GET не обязан каждый раз возвращать одинаковый ответ, между запросами данные в системе могли измениться (например, добавились записи в список), и второй ответ будет отличаться.
❌ Идемпотентность - это когда повторный запрос не выполняется.
Нет, повторный запрос может точно так же пройти через приложение и обратиться к БД. Идемпотентность не означает, что система обязана распознать дубль и проигнорировать его. Дедупликация - один из способов обеспечить идемпотентность, но не сама идемпотентность. Для некоторых ситуаций нужна дедупликация, а для GET-запроса, например, совершенно нормально повторно выполнить те же действия.
✅ Идемпотентность - это свойство операции, при котором многократное выполнение этой операции приводит к такому же эффекту, как и однократное выполнение.
То есть важно не то, сколько раз реально выполнился код и какие ответы мы получили, а какой эффект оказала операция.
А зачем вообще нужна идемпотентность? Почему о ней так много говорят?
Практический смысл этого свойства хорошо виден при ретраях. Например, из-за сетевого сбоя клиент не получил ответ и не знает, был ли первый запрос обработан. Если операция идемпотентна, запрос можно безопасно повторить.
Сюда же повторная доставка сообщений из Кафки, когда обработать успели, а закоммитить оффсет не успели.
POST не считается идемпотентным методом по семантике HTTP, но мы можем спроектировать и реализовать его идемпотентно, когда нужно. Уверена, многие с этим сталкивались.
Например, когда реализуем поиск с фильтрами:
POST /orders/search
{...}
Или когда генерируем на клиенте и передаем на бэк специальный уникальный идентификатор запроса -
Idempotency-Key. Когда такой запрос приходит первый раз, бэк его обрабатывает, а уникальный Idempotency-Key сохраняет. При повторном запросе с тем же Idempotency-Key бэк понимает, что это дубль, и бизнес-операцию повторять не нужно. Например, при запросе на списание платежа, при заказе такси и др.
Итого краткий ответ:
Идемпотентность — это свойство операции, при котором многократное выполнение этой операции приводит к такому же эффекту, как и однократное выполнение.
А дальше можно привести примеры идемпотентных и неидемпотентных операций, чтобы развернуть мысль.
А вас спрашивали на собесах определение идемпотентности?