电子商务应用程序设计:如何在二手商品网站上管理购物车?

时间:2012-01-15 22:12:58

标签: ruby-on-rails e-commerce

我正在使用带有PayPal API的Ruby on Rails为旧货制作电子商务市场,以完成购买。所以基本上这笔交易是人们可以买卖他们的东西 - 比如eBay或Half.com。使用所有项目。这是我的问题:用过的商品意味着每件商品都是独一无二的 - 至少在卖家通常只携带他们销售的二手商品的意义上。这给我带来了我的问题,对于之前遇到过这类问题的开发人员:我应该如何处理以下情况:

  • 卖家列出他的运动衫
  • 第1号人物将运动衫加入购物车
  • 第2号人物将同样的运动衫加入购物车
  • #1人通过PayPal
  • 结账

现在,我对Person#2做了什么?显然,他不能查看同样的运动衫,因为卖家只有1件运动衫。我想知道的是我应该如何处理这种情况。到目前为止,我已经提出了两种可能的解决方案,但对我来说似乎都不令人满意。 (顺便说一下,添加用户当前购物车是会话变量可能是相关的)

选项#1:当人员#1将运动衫添加到他的购物车时,您可以使用布尔字段(例如available = false)标记运动衫。这样做的缺点是用户可以将项目添加到他的购物车,然后闲置。因此,在第1个人的购物车到期之前,没有人可以购买该商品。

选项#2:当我从PayPal获得IPN时,运动衫仅被标记为不可用。这样做的缺点是你理论上可以让人#1和#2立即从PayPal中退出,因此他们都会购买运动衫,直到我拿到IPN之后我才意识到我已经知道了卖了两次产品。

StackOverflow的想法是什么?是否有任何有这方面经验的人可以提供一些见解?

2 个答案:

答案 0 :(得分:12)

您可以使用locked_bylocked_until标记,而不是拥有锁定的标记并使后台进程找到锁定的项并使这些锁失效。

当某人向购物车添加内容时,请将locked_by设置为他们,将locked_until设置为10分钟。如果他们采取某些行动(例如,一旦他们实际开始结账流程再给他们几分钟),您可能会考虑碰撞locked_until

当您想测试某些内容是否可用时,只需检查locked_until是否过去。这样,一旦宽限期过去,您就不需要重置锁定列。

如果同一产品有多个实例(即这件运动衫有5件),你仍然可以通过使用代表实际物理对象的第二个模型来使用这种方法,即你可能有

class Product < AR:Base
  has_many :physical_objects
end

PhysicalObject的实例代表实际项目(而不是理想化对象)。由于你有5件运动衫,运动衫产品有5件物品。 PhysicalObject还可以跟踪每个项目可能不同的内容(例如,它所在的仓库)。

锁定列然后位于物理对象上:当有人将产品添加到购物车时,您锁定该产品的一个物理对象,当确认订单时,您可以使物理对象永久消失(甚至删除它)。如果您使用与之前相同的锁定策略,则无需执行任何扫描类型任务来清除锁定。

无论你做什么,你应该考虑乐观锁定,以防止两个客户试图同时将同一产品添加到他们的购物车时的竞争条件

答案 1 :(得分:7)

这是交易 -

  • 卖家列出他的运动衫
  • 第1号人物将运动衫加入购物车
  • 第2号人物将同样的运动衫加入购物车
  • #1人通过PayPal
  • 结账
  • 防止他们两人最终购买库存中有1个数量的相同商品。

在我看来,处理这种情况的一种方法是(哪种是选项#1 的升级版本) -

当第1个人在购物车中添加商品时,您将(如果不是,则应该)更改订单状态,即在购物车中地址付款完成

因此,当第1人在其购物车中添加第A项时(状态:in cart)阻止其他人持续10分钟(第2人< / strong>)将它们添加到 购物车 中。现在,您需要使用服务器上运行的 crone job rake脚本延迟作业来检查每个产品,在这种情况下Item A位于 orders table in cart 状态为10或10以上分钟并刷新/从中删除产品。这将使其他人( Person 2 )能够将该项目添加到他们的购物车中。让其他人(人2 )和人1 更新您关于这10分钟冲洗事情的过程,并发出某种通知。例如:项目1将在Time Counter running 提供给人员2 项目1将进入Time Counter running 人1 。在这个过程中,这个过程会让用户感到紧迫感,并且您可以控制您的库存,而不是让物品的销售量超过手头数量 / 数量。您可以在此网站上查看实时和正在运行的实施 - http://www.thepeacockparade.com/

希望它能为您提供一个处理这种情况的公平想法。是的,如果,你有更好的方法来做同样的事情,请让我更新它,因为,我也在寻找升级。

由于

效果更新

实施此流程后,您的网站可能会遇到一些性能问题。我找到了一种方法来保持您的应用程序正常运行,为客户提供服务以及同时同步的后台进程,如果您使用 amazon rds 或任何其他云数据库服务您可以拥有两个不同的应用服务器。一个供您的客户服务,另一个用于执行后台流程,例如清理临时数据,文件,rake任务,上传数据等。由于您的应用程序数据库完全在您的应用程序服务器之外,因此可以从两个应用程序更新。因此,它将使您的主应用程序更好地为其用户服务,而不是挨饿后台进程使用的内存。

数据库设置更新

对于数据库关联,Rails非常棒。如果您不熟悉亚马逊云数据库服务,请在此处查看他们的计划:http://aws.amazon.com/rds/pricing。关于在亚马逊rds 上建立数据库的最佳部分是 -

  • 您可以自由选择近端点/服务器位置 为您的应用程序提供数据库,这将减少延迟 数据库查询服务器加载处理它们。
  • 您可以使用多个应用程序来访问它。显然出于不同的目的,即一个用于上传数据,另一个用于运行分析等。
  • 您只需支付使用的费用。
  • 如果出现任何问题(有时由于某些原因,我更喜欢悲观主义者)出错,服务器因任何奇怪的原因而崩溃。你没有搞砸!!您的 DATABASE 是安全的。刚刚建立一个新的应用程序,瞧!!你很快就回来了。
  • 您可以自由地自动执行数据库备份,而无需深入了解 BASH SCRIPTS
  • 您可以随着业务增长而扩展它。

要设置亚马逊rds数据库,请转到您的amazon rds控制台:https://console.aws.amazon.com/rds/home。从页面左侧的导航窗格中选择首选的区域。点击&#34; 启动数据库实例&#34;按钮,选择您喜欢的数据库并按照流程的其余部分,即选择实例类型等。

现在,如果您的 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数据库实例一起使用。现在rake db:create测试连接,rake db:migrate创建表格

我想在此添加一件事。如果您想让自己的生活更美好,那么您也应该使用 amazon s3(简单存储服务)。它该死的便宜又可靠,请在此处查看:http://aws.amazon.com/s3/

享受!!