Дизайн приложения электронной коммерции: как управлять корзинами покупок на сайте подержанных товаров? - PullRequest
9 голосов
/ 16 января 2012

Я создаю площадку электронной коммерции для подержанных товаров, используя Ruby on Rails с PayPal API для совершения покупок.По сути, дело в том, что люди могут покупать и продавать свои вещи - например, eBay или Half.com.Все предметы используются.Вот мой вопрос: подержанный товар означает, что каждый предмет уникален - по крайней мере, в том смысле, что продавцы обычно несут только 1 использованный товар, который они продают.Это вызывает у меня вопрос к разработчикам, которые сталкивались с подобными проблемами раньше: как мне справиться с ситуацией, в которой:

  • Продавец перечисляет свою толстовку
  • Человек № 1добавляет толстовку в свою корзину
  • Человек № 2 добавляет такую ​​же толстовку в свою корзину
  • Человек № 1 проверяет через PayPal

Теперь, что мне делатьс человеком № 2?Ясно, что он не может проверить ту же самую толстовку, потому что у продавца есть только одна толстовка.То, что я хочу знать, - как мне справиться с этой ситуацией.Пока что я нашел два возможных решения, но ни одно из них не кажется мне удовлетворительным.(Кстати, было бы уместно добавить, что текущая корзина пользователя является переменной сеанса)

Вариант № 1: Когда Лицо № 1 добавляет толстовку в свою корзину, вы помечаете толстовку с логическим полемнапример, доступно = ложь.Недостатком является то, что пользователь может добавить товар в свою корзину, а затем бездействовать.Таким образом, никто не может приобрести товар до тех пор, пока не истечет срок годности корзины № 1.

Вариант № 2: Толстовка помечается как недоступная только тогда, когда я получаю IPN от PayPal.Недостатком этого является то, что теоретически вы можете получить лиц № 1 и № 2, выписывающихся из PayPal одновременно, и, таким образом, они оба купят толстовку, и только после того, как я получу IPN, я пойму, что япродал продукт дважды.

Что думает StackOverflow?Есть ли кто-нибудь с опытом в этой области, который может предложить некоторое понимание?

Ответы [ 2 ]

12 голосов
/ 19 января 2012

Вместо того, чтобы иметь заблокированный флаг и иметь фоновый процесс, который находит заблокированные элементы и истекает эти блокировки, вы могли бы вместо этого иметь locked_by и locked_until флаги.

Когда человек добавляет что-то в свою корзинуустановите для них locked_by и locked_until на 10 минут в будущем.Возможно, вы захотите рассмотреть вопрос об увеличении locked_until, если они предпримут определенные действия (например, дайте им еще несколько минут, как только они действительно начнут процесс оформления заказа).

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

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

class Product < AR:Base
  has_many :physical_objects
end

, а экземпляр PhysicalObject представляет фактический элемент (а не идеализированный объект).Так как у вас есть 5 толстовок, в изделии из толстовок есть 5 физических объектов.PhysicalObject также может отслеживать вещи, которые могут различаться для каждого товара (например, в каком складе он находится).

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

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

7 голосов
/ 16 января 2012

Вот предложение -

  • Продавец перечисляет свою толстовку
  • Человек # 1 добавляет толстовку в свою корзину
  • Человек # 2 добавляет ту же толстовку кего корзина
  • Персона # 1 оформляет заказ через PayPal
  • Предотвратите их покупку в конечном итоге одного предмета, у которого есть 1 количество в вашем инвентаре.

В одну сторонупо моему мнению, справиться с этим сценарием (это своего рода обновленная версия вашей опции # 1 ) -

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

Таккогда Персона 1 добавляет Элемент A в корзину (статус: in cart), блокируйте его на 10 минут, чтобы другие ( Персона 2 ) добавляли их в свои корзина .Теперь вам нужно иметь rake script или Delayed Job с использованием crone job , работающий на вашем сервере , который проверяет все продукты, в данном случае Item A в orders table со статусом in cart в течение 10 или более 10 минут и очистите / удалите эти продукты из этой строки .Что позволит другим ( Person 2 ) добавить этот предмет в корзину.И пусть другие ( Персона 2 ) и Персона 1 будут проинформированы о вашем процессе этой 10-минутной промывки с некоторым уведомлением.Например: Элемент 1 будет доступен в Time Counter running до Person 2 и Item 1 перейдет в Time Counter running до Person 1 .Здесь этот процесс будет создавать ощущение срочности в сознании пользователей, и вы будете контролировать свой инвентарь, не продавая предмет больше, чем его количество в наличии / количество .Вы можете проверить этот веб-сайт на наличие работающей реализации - http://www.thepeacockparade.com/

Надеюсь, это даст вам справедливую идею справиться с этой ситуацией.И да, если у вас есть какой-нибудь лучший способ сделать то же самое, пожалуйста, держите меня в курсе, потому что я тоже ищу обновление.

Спасибо

Обновлениепо производительности

После реализации этого процесса у вас могут возникнуть проблемы с производительностью на вашем веб-сайте.Один из способов, которым я нашел способ поддерживать ваше приложение в рабочем состоянии и одновременно обслуживать ваших клиентов и фоновый процесс, - это если вы используете amazon rds или любые другие служба облачных баз данных у вас может быть два разных сервера приложений.Один для ваших клиентов, а другой для выполнения фоновых процессов, таких как очистка временных данных, файлов, выполнение граблей, загрузка данных и т. Д. И поскольку ваше приложение база данных находится полностью вне ваших серверов приложений, оно можетобновляться из обоих приложений.Таким образом, оно будет поддерживать ваши основные приложения еще лучше для своих пользователей, вместо того, чтобы голодать из-за памяти, используемой фоновыми процессами.

Обновление настроек базы данных

Rails - это здорово, когда дело доходит до база данных , таблицы и ассоциации .Если вы новичок в облачной службе баз данных amazon , ознакомьтесь с их планами здесь: http://aws.amazon.com/rds/pricing. Лучшее в том, что ваша база данных на amazon rds are -

  • Вы можете выбрать ближайшую конечную точку / расположение сервера , чтобы обслуживать вашу базу данных для вашего приложения, что уменьшит задержку ваших запросов db и вашей нагрузки на сервер при их обработке.
  • Вы можете использовать несколько приложений для доступа к нему.Очевидно, для разных целей, например, один для загрузки данных, второй для запуска аналитики и т. Д.
  • Вы должны платить только за то, что используете.
  • Если что-то (иногда по некоторым причинам я предпочитаю быть пессимистом) идет не так, как надо, и сервер вылетает по какой-то странной причине. Вы не облажались! Ваша БАЗА ДАННЫХ в безопасности. Просто установите новое приложение и вуаля! Вы вернулись в кратчайшие сроки.
  • У вас есть свобода автоматизировать резервное копирование базы данных , не запутываясь в BASH SCRIPTS .
  • Вы можете расширять его по мере роста вашего бизнеса.

Чтобы настроить базу данных amazon rds , перейдите на консоль amazon rds: https://console.aws.amazon.com/rds/home. Выберите предпочитаемый регион из Панель навигации панель слева сторона страницы. Нажмите кнопку " Launch DB Instance ", выберите предпочитаемую Database и следуйте остальной части потока, то есть выберите тип экземпляра и т. Д.

Теперь, если у вас запущен rds экземпляр , вы можете увидеть конечную точку примерно так: database-name.random-string.region-endpoint.rds.amazonaws.com. В вашем приложении rails отредактируйте и обновите config / database.yml по следующему адресу:

production:
  adapter: mysql2
  host: database-name.random-string.region-endpoint.rds.amazonaws.com
  encoding: utf8
  reconnect: false
  database: databse-name
  username: master-username
  password: password

Выглядел удивленным ?? Да это оно!! Все готово для использования вашего приложения с новым экземпляром amazon rds DB . Теперь rake db:create для проверки соединения и rake db:migrate для создания таблиц .

Здесь я хотел бы добавить еще одну вещь. Если вы хотите улучшить свою жизнь, используйте amazon s3 (простой сервис хранения) . Это чертовски дешево и надежно, посмотрите здесь: http://aws.amazon.com/s3/

Наслаждайтесь !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...