Идемпотентность, или почему не стоит платить за один заказ дважды

Нажали «Оплатить». Сайт задумался о вечном, крутит загрузку и не сообщает вообще ничего полезного.

Нажали ещё раз. На всякий случай. Поздравляю, теперь у платёжной системы есть шанс списать с вас деньги дважды 🙃

Для избегания таких ситуаций и нужна идемпотентность — свойство операции, при котором повторное выполнение не меняет результат после первого выполнения.

Например, установить громкость на 50% можно хоть десять раз — она всё равно останется на 50%. А вот прибавить громкость на 10% десять раз — уже совсем другая история. С оплатой похожая проблема. Если сервер воспринимает каждый запрос как новую операцию, два нажатия могут превратиться в два платежа. И неважно, что пользователь хотел купить всего одну штуку.

Поэтому в платёжных API часто используют ключ идемпотентности (Idempotency-Key). Это уникальный идентификатор конкретной попытки оплаты. Отправили запрос с ключом abc123, сервер начал обрабатывать платёж. Ответ где-то потерялся по дороге, и клиент отправил запрос повторно с тем же ключом. Сервер распознаёт повторную попытку и не создаёт второй платёж. Вместо этого возвращает результат исходной операции.

При этом идемпотентность не гарантирует, что запрос придёт ровно один раз. Он может прийти дважды, трижды или сколько угодно раз. Задача — не допустить повторного эффекта.

#ks_разработка #ks_буковки

Идемпотентность, или почему не стоит платить за один заказ дважды
Нажали «Оплатить». Сайт задумался о вечном, крутит загрузку и не сообщает вообще ничего полезного.
Нажали ещё раз. На всякий случай | Сетка — социальная сеть от hh.ru