Лучшая практика для управления параллелизмом в корзину на сайте электронной коммерции

19

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

Нужно ли проверять код корзины, чтобы один из этих двух покупателей не добавил один и тот же товар?

Или эта проверка должна выполняться на этапе оплаты, например, при выполнении второго запроса для подтверждения того, что соответствующий товар все еще присутствует на складе (значит, еще не куплен одновременным покупателем)?

Mik378
источник
На некоторых сайтах, например, при бронировании билетов в театр, предмет удерживается в течение ограниченного времени, пока заказ обрабатывается
Брэд Томас

Ответы:

11

На этот вопрос нет идеального ответа, и все зависит от деталей.

В качестве первой «линии защиты» я бы вообще старался избегать таких ситуаций, просто не распродавая статьи настолько низко, насколько это возможно. Если это возможно, может зависеть от ситуации и вида товаров, которые вы хотите продать. В компании, в которой я работаю, статьи в основном удаляются с сайта до того, как у нас заканчивается товар. Но мы продаем всю продажу, и несколько оставшихся товаров продаются нашими специалистами по продажам в качестве специальных предложений. Это может не подходить для небольших магазинов, особенно при продаже дорогих товаров.

Решение сделать двойную проверку при добавлении чего-либо в корзину не очень хорошо. Люди много кладут в корзины, даже не размещая заказ. Так что это может заблокировать эту статью на определенный период времени.

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

Торстен Мюллер
источник
хороший улов - мало в наличии и высокие цены
rohanagarwal
5

Я думаю, что лучше всего выбирать, какой из приведенных ниже вариантов больше подходит для конкретного бизнес-случая :

  1. Оптимистичная блокировка в автономном режиме

    ... решает эту проблему ( проблему конфликта сеансов ), проверяя, что изменения, которые должны быть зафиксированы одним сеансом, не конфликтуют с изменениями другого сеанса. Успешная проверка перед фиксацией, в некотором смысле, заключается в получении блокировки, указывающей, что можно продолжать вносить изменения в данные записи. Пока проверка и обновления происходят в одной системной транзакции, бизнес-транзакция будет отображать согласованность ...

  2. Пессимистичная автономная блокировка
    ... предотвращает конфликты, избегая их вообще. Это вынуждает бизнес-транзакцию получить блокировку для части данных, прежде чем она начнет ее использовать, так что большую часть времени, когда вы начинаете бизнес-транзакцию, вы можете быть почти уверены, что завершите ее, не будучи отклоненным параллелизмом. контроль ...
«В то время как пессимистическая автономная блокировка предполагает высокую вероятность конфликта сеансов и, следовательно, ограничивает параллелизм системы, оптимистическая автономная блокировка предполагает низкую вероятность конфликта. Ожидается, что конфликт сеансов вряд ли позволит нескольким пользователям работать с одним и тем же данные одновременно. "

комар
источник
5

Это проблема людей , а также проблема с базой данных, блокировка базы данных - это просто!

Учитывая, что клиент может никогда не проверить ...

У вас есть два основных варианта:

  • Вы резервируете товар для клиента на определенное время, скажем (20 минут), после того, как он добавит его в корзину - после того, как ему придется перепроверить уровень запаса или начать заново. Это часто используется для билетов на мероприятия или места авиакомпании.

  • Или вы говорите что-то вроде «ххх, обычно отправляется в течение 24 часов», но зарезервируйте запас при оформлении заказа, в этом случае вы должны разрешить им отменить заказ после оформления заказа, если некоторые товары есть в наличии, а другие нет. (Зеленый, Желтый, Красный уровни запасов также могут хорошо работать, или некоторые веб-сайты говорят «низкий запас», когда они снижаются до 1 или 2)

Ян
источник
2

Как всегда, все зависит от ваших требований. Если вы являетесь Amazon и продаете 100 000 000 товаров в день, накладные расходы на упреждающую проверку и блокировку, вероятно, будут чрезмерными, и проблема того, что один клиент в день не получит свой товар, ничтожна. Если вы имеете дело с редкими старинными религиозными иконами, которые уникальны и дороги, вероятно, применяется обратное. Вы сами должны знать, где находится ваше экономическое обоснование в этом спектре.

Килиан Фот
источник
2

В нашем случае мы использовали очередь сообщений для обработки заказов и настроили ее так, чтобы она обрабатывала только одну работу за раз в одном и том же продукте в режиме FIFO.

Предостережение заключается в том, что вы добавляете новые издержки ко всей обработке заказов, что немного затягивает.

Korayem
источник
Вы ограничиваете очередь для использования только одним потребителем
rohanagarwal
1

Очевидно, что для пользователя лучше всего убедиться, что второе добавление завершится неудачно. Но это замедлит весь ваш сайт ради 0,1% случая.

Наиболее технически эффективное решение, позволяющее максимизировать продажи, состоит в том, чтобы позволить ему добиться успеха, а затем попытаться выполнить оба заказа позже - просто потому, что у вас сейчас нет на складе, это не значит, что вы не можете его найти в чрезвычайной ситуации. Если вы не можете, тогда кто-то должен связаться с пользователем, который повезло и извиниться. Но это именно то, что вызвало шум перед Рождеством в этом году (это не единственная статья, которая появилась, поэтому извиняюсь за Best Buy, но это был первый, который я нашел).

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

прецизионный самописец
источник