Обновить

Стандарт решения проблемы двойных списаний в финтех, или О чем спросят системного аналитика на собеседовании

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели7.4K
Всего голосов 6: ↑3 и ↓3+2
Комментарии14

Комментарии 14

Доходчиво изложено, спасибо. Насколько я понимаю, у варианта с блокировкой кнопки также недостаток в том что шибко умный юзер может дергать API через Postman и тем самым обходить блок кнопки на фронте.

спасибо, рада! этот вариант тоже не назовешь случайным повтором )

В синхронном сценарии есть проблемка, между шагами 1 и 2 в браузерной реализации есть место для состояния гонки:

1. Пользователь нажимает кнопку Перевести
2. Кнопка становится неактивной
    Запрос уходит на сервер, интерфейс ждёт ответ

Обработчикам в js требуется небольшое время на то, чтобы сделать кнопку неактивной.
Престарелые мышки у пользователей могут выдавать несколько кликов вместо одного из-за эффекта дребезга контакта. Время между событиями составляет единицы милисекунд.

Описанный синхронный подход не защищает от этой гонки.

Вниманимательно слушаю почему эта конструкция не будет работать? 👀

button.addEventListener('click', () => {

  button.disabled = true; // 1. Сначала выключаем

  sendData();             // 2. Потом отправляем

});

Между кликом и button.disabled = true проходит ненулевое время, в этот промежуток времени возникает состояние гонки.

Пытаюсь найти банк, но тут ни слова, хотя есть пару где есть такая беда

Вы прошли собес в итоге? Вам сделали оффер?

в поиске, в переговорах, статьи пока пишу )

У вас алгоритм для идемпотентности некорректный. Если вы генерируете уникальный ключ на клиенте при нажатии кнопки, то повторные нажатия дадут разные уникальные ключи и пройдут две оплаты.

ключ будем генерить до отправки запроса, и если параметры запроса не меняются, то и ключ не изменится

Ну ка, какие у вас будут параметры, которые формируют ключ? Сумма, отправитель и получатель? Тогда точно такая же отправка средств будет заблокирована, хотя по факту это именно другой перевод.

Банально timestamp генерации формы даст уникальность

Да, но судя по схеме ТС ключ генерируется при нажатии кнопки, а не при формировании формы отправки.

в асинхронном варианте вся проблема в том, кто решает новый это запрос или повторный.

если перезагрузили страницу и нажимаем перевод еще раз пока не получили ответ по первой операции, это будет новый запрос или повторный?

если надо выполнить подряд два одинаковых перевода(один и тот же получатель и сумма), то не получится ли что пользователю придет два подтверждения, а по факту перевод будет один?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации