Базовый и важный метод разработки REST API.
Проблема двойной отправки веб-форм уже давно является головной болью разработчиков веб-приложений. Наличие дублирующих запросов без должной обработки может иметь разрушительные последствия, например, финансовые потери из-за двойных платежей.
Хотя проблему в основном можно предотвратить путем отключения кнопки отправки и использования устранения дребезга в пользовательском интерфейсе, она зависит исключительно от обработки на стороне клиента, и лазейка все еще существует без защитной логики на внутренней стороне.
Давайте посмотрим на упрощенную версию процесса оформления заказа в онлайн-корзине ниже. Предположим, что клиент произвел платеж, и мы обработаем отправленную онлайн-корзину покупок следующим образом:
- Создать запись о доставке
- Отправить уведомление клиенту
- Обновить статус корзины на «Отправлено»
Оформление заказа в корзине в реальном мире может быть гораздо сложнее, это упрощенная версия для демонстрационных целей.
Если оплата произведена, что произойдет, если для одной и той же онлайн-корзины будет отправлено более одного запроса на оформление заказа? Согласно приведенному выше порядку оформления заказа, двойная отправка может привести к созданию дублирующих записей о доставке и уведомлению клиента.
В этой статье я поочередно расскажу вам о каждом подходе, чтобы создать решение для обнаружения и возврата ошибки 409 Conflict в случае дублирования запросов.
Вариант №1 — Проверка существования записи перед вставкой
Проверка наличия записи в базе данных перед ее вставкой разумна, однако это имеет смысл только в однопоточной среде.
Современные вычисления обрабатывают несколько запросов одновременно. На одной и той же машине может выполняться несколько потоков, которые одновременно обрабатывают несколько входящих запросов. В приведенном ниже примере показано, что повторяющиеся записи все равно будут создаваться в многопоточной среде, даже если запись…