helm2004
Апрель 5, 2016 13:03:10
Доброго времени суток! Решил оставить тему здесь, чтоб не было холивара.
Есть задача: Нужно организовать очередь. То есть: Один юзер покупает вещь, а другой юзер терпеливо ждет пока первый ее не купит. Чтоб одновременно не могли купить одну вещь. Ведь на складе может и не быть 2х.
Как сие организовать? Смотрю в сторону Celery. Или я не прав?
Спасибо за ответы.
FishHook
Апрель 5, 2016 13:17:58
helm2004
Чтоб одновременно не могли купить одну вещь.
Перед тем как пометить вещь как проданную, смотрим, не стоит ли у неё флаг “продано”?
helm2004
Апрель 5, 2016 13:58:15
Я не правильно выразился - есть биржа, где одновременно есть несколько предложений. И вот один Юзер прошелся про предложениям и купил что-то, одновременно и Юзер тоже проходится по предложениям. Может быть коллизия.
FishHook
Апрель 5, 2016 15:46:03
Коллизии решаются транзакциями запросов, разве нет?
helm2004
Апрель 5, 2016 16:43:49
Вот и мы дошли к самому интересному. Как работают транзакции на Джанге/Постгре? Почитать где-то об этом
можно?
FishHook
Апрель 5, 2016 16:53:56
ZAN
Апрель 7, 2016 13:27:25
helm2004
Здесь действительно два варианта - разрешать коллизию на уровне транзакций в базе данных, либо проводить операцию покупки через очередь заданий, где количество параллельных заданий равно 1.
Несмотря на то, что очередь заданий требует дополнительный сервис (celery + брокер (RabbitMQ, Redis, etc)), код обработки критической секции будет проще, т.к. запросы гарантировано будут уложены в очередь и будут обрабатываться последовательно.
inoks
Апрель 13, 2016 15:38:46
У вас High-load и больше 100к конкуретных запросов?
Или задача зарезирвировать товар для Пользователя1, на время прохождения оплаты, внесения рекивизитов и т.п. и вернуть его в остатки в случае если что то не срослось с Пользователем1?
helm2004
Апрель 15, 2016 09:52:27
Второй вариант.