Форум сайта python.su
Доброго времени суток! Решил оставить тему здесь, чтоб не было холивара.
Есть задача: Нужно организовать очередь. То есть: Один юзер покупает вещь, а другой юзер терпеливо ждет пока первый ее не купит. Чтоб одновременно не могли купить одну вещь. Ведь на складе может и не быть 2х.
Как сие организовать? Смотрю в сторону Celery. Или я не прав?
Спасибо за ответы.
Офлайн
helm2004Перед тем как пометить вещь как проданную, смотрим, не стоит ли у неё флаг “продано”?
Чтоб одновременно не могли купить одну вещь.
Офлайн
Я не правильно выразился - есть биржа, где одновременно есть несколько предложений. И вот один Юзер прошелся про предложениям и купил что-то, одновременно и Юзер тоже проходится по предложениям. Может быть коллизия.
Офлайн
Коллизии решаются транзакциями запросов, разве нет?
Офлайн
Вот и мы дошли к самому интересному. Как работают транзакции на Джанге/Постгре? Почитать где-то об этом
можно?
Офлайн
может тут?
Офлайн
helm2004
Здесь действительно два варианта - разрешать коллизию на уровне транзакций в базе данных, либо проводить операцию покупки через очередь заданий, где количество параллельных заданий равно 1.
Несмотря на то, что очередь заданий требует дополнительный сервис (celery + брокер (RabbitMQ, Redis, etc)), код обработки критической секции будет проще, т.к. запросы гарантировано будут уложены в очередь и будут обрабатываться последовательно.
Офлайн
У вас High-load и больше 100к конкуретных запросов?
Или задача зарезирвировать товар для Пользователя1, на время прохождения оплаты, внесения рекивизитов и т.п. и вернуть его в остатки в случае если что то не срослось с Пользователем1?
Офлайн
Второй вариант.
Офлайн