2012-01-15 35 views
9

我正在使用Ruby on Rails与PayPal API完成购买,为二手商品创建电子商务市场。所以基本上这个交易是人们可以买卖他们的东西 - 比如eBay或Half.com。所有项目都被使用。以下是我的问题:旧货意味着每一件物品都是独一无二的 - 至少在卖家通常只携带其销售的二手物品中的一种的意义上。这使我想到我的问题,因为谁遇到了这种之前问题的任何开发者:我应该如何处理其中的情况:电子商务应用程序设计:如何管理旧商品网站上的购物车?

  • 卖家列出了他的运动衫
  • 人#1增加了运动衫给他的车
  • 人#2通过PayPal

添加相同的运动衫给他的车

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

    选项#1:当人#1增加了运动衫给他的车,你标志和一个布尔领域,如运动衫可用= false。缺点是用户可以将物品添加到购物车,然后闲置。因此,在1号人物的购物车过期之前,没有人可以购买该物品。

    选项2:当我从PayPal获得IPN时,运动衫仅被标记为不可用。这样做的缺点是,理论上你可能会立即从PayPal检出第一和第二人,因此他们都会购买运动衫,直到获得IPN后我才意识到自己已经购买了运动衫售出产品两次。

    StackOverflow认为什么?在这方面有经验的人可以提供一些见解吗?

  • 回答

    7

    这里是交易 -

    • 卖家列出了他的运动衫
    • 人#1增加了运动衫给他的车
    • 人#2添加相同的运动衫给他的车
    • 人#1通过PayPal结账
    • 防止他们最终购买同样的物品,其中有1个数量在您的库存。在我看来,以处理这种情况

    一种方式是(这是一种你选项#1的升级版) -

    当1个人在他们的车,你会增加一个项目(如没有,那么你应该)更改订单状态,即在车地址支付完整等。

    所以当人1增加项目在他们的车一(状态:in cart)阻止它10分钟为他人(人2)将其添加到他们的。现在,你需要有一个耙脚本使用服务器,检查每一个产品上运行科龙工作延迟工作,在这种情况下Item Aorders tablein cart状态10或超过10分钟并冲洗/删除那些产品从那。这将使其他人(人2)将其添加到他们的购物车。并有其他人(人2)和人1更新有关你的这个10分钟冲洗过程的某种通知。例如:项目1将Time Counter running人2项目1将在Time Counter running人1可用。在这里,这个过程会让用户心中有一种紧迫感,并且您可以控制您的库存,因为您的库存数量不会超过手数/数量。你可以查看这个网站的实时运行实现 - http://www.thepeacockparade.com/

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

    感谢

    更新性能

    实施这一过程之后,你可能最终得到一些性能在网站上发布。一种方法我想出了一个办法,让您的应用程序在运行,服务的客户,并在同一时间同步的,如果你使用amazon rds或任何其他云数据库服务的后台进程你可以有两种不同的应用服务器。一个用于客户服务,另一个用于执行后台进程,例如清理临时数据,文件,耙取任务,上传数据等。由于您的应用程序完全位于您的应用程序服务器之外,因此可以同时从这两个应用程序服务器进行更新应用。因此,它将使您的主应用程序更好地服务于其用户,而不是挨饿后台进程使用的内存。对数据库设置

    Rails的

    更新是真棒,当谈到数据库协会。如果您是亚马逊云数据库服务的新手,那么请查看他们的计划:http://aws.amazon.com/rds/pricing。关于亚马逊有你的数据库最好的RDS是 -

    • 你可以自由地选择靠近端点/服务器位置到 为你的数据库应用程序,这将减少 你分贝的延迟查询和您的服务器负载处理它们。
    • 您可以使用多个应用程序来访问它。显然是出于不同的目的,即一个用于上传数据,另一个用于运行分析等。
    • 您必须仅为您使用的内容付费。
    • 如果有什么(有时由于某些原因,我更喜欢成为悲观主义者)出问题并且服务器因任何奇怪的原因而崩溃。你没有拧!您的数据库是安全的。只需建立一个新的应用程序,瞧!你很快就回来了。
    • 您可以自由自动化数据库备份而不会让您的头变为BASH SCRIPTS
    • 随着业务的增长,您可以扩展它。

    要设置亚马逊RDS数据库去你的亚马逊RDS控制台:https://console.aws.amazon.com/rds/home。选择您的首选区域导航窗格在页面的左侧。点击“启动数据库实例”按钮,选择您首选数据库,并按照流程的其余部分,即,选择实例类型等

    现在,如果你有你的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 
    

    看起来很惊讶?对,就是那样!!你都准备好使用你的应用程序和你的新的亚马逊数据库实例。现在rake db:create来测试连接和rake db:migrate来创建你的

    这里我想补充一点。如果你关心让你的生活变得更好,那么你应该使用亚马逊S3(简单存储服务)。这该死的廉价和可靠的,看看这里:http://aws.amazon.com/s3/

    享受!

    +0

    哇添加到他们的购物车!感谢您的非常详细的回应 - 我喜欢这个主意了很多,不仅是因为它的工作原理,也像你说的,因为计时器为用户提供了“紧迫感”,从而鼓励购买宜早不宜迟。为了获得更多的想法,我会将这个问题公开几天,但这是一个很好的答案。非常感谢。 +1 – varatis 2012-01-17 00:31:39

    +0

    非常欢迎。但我试图找出更好的想法来解决这个问题,甚至可能没有打破表现。在发布之后,我想了解更多关于这个过程的信息,并最终提出了一个保持性能的流程,然后确保流程就位和同步。请参阅帖子的更新部分。 – Surya 2012-01-17 05:45:20

    +0

    这对服务器来说是一个有趣的想法。但至于你的最初想法,我很好奇Half.com或Amazon这样的网站如何处理这种情况:尽管我没有测试在任一站点上以完整方式签出项目,但似乎都允许不同的用户将相同的物品添加到他们的购物车。 – varatis 2012-01-17 14:50:35

    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还可以跟踪每个项目可能有所不同的内容(例如,它位于哪个仓库)。

    锁定列然后坐在物理对象上:当有人向他们的购物车中添加产品时,您锁定该产品的物理对象之一,当确认订单时可以使物理对象永久消失(或甚至删除它)。如果您使用与之前相同的锁定策略,则不需要执行任何清理类型的任务来清除锁定。

    不管你做什么,你应该看看乐观锁定,以防止竞争条件,如果两个客户尝试在同一产品在同一时间

    +0

    这与Surya的回答有何不同?此外,请注意,PhysicalObject可能不会非常有用,因为这是一个二手商品网站(实质上只有一个商品,没有仓库)。 – varatis 2012-01-19 17:16:47

    +0

    这是不同的,你不必定期检查过期旧锁。如果你只有一件物品,你可以在答案的前半部分采用这种方法。 – 2012-01-19 18:12:54

    +0

    是的,这是有道理的。 – varatis 2012-01-19 20:00:53

    相关问题