购物车中的最后一项

问题描述 投票:0回答:2

我正在学习微服务并试图设计一个电子商务网站。我无法弄清楚大型购物网站如何处理购物车问题中的最后一项。

例如,我从亚马逊中选择了一个只有一个库存商品的商品。我从两个不同的帐户登录并将该项目放入购物车。我甚至从帐户和网站都到达了付款页面并没有限制我在任何地方说该项目不可用。我不确定在付款页面之后,来自两个帐户的付款正在进行中,亚马逊如何处理它。

我想到的几个解决方案就像:

  1. 接受来自两个帐户的付款,然后取消其中一个晚于第一个付款的交易。这不是一个好的做法,因为它将带来基本的客户体验。
  2. 保留少量物品并在超量预订时使用它们。
  3. 我忘记了亚马逊正在做什么,并在订单的每个阶段通过REST调用从Item服务实施订单服务中的数量检查。但是,当许多人订购相同的商品时,这些检查有时会失败。例如在闪存销售

如果你们已经解决过类似的问题,请分享,即使只有很少的限制也可以解决。如果我需要提供更多细节,请告诉我。

java microservices shopping-cart
2个回答
2
投票

我无法回答Amaozon是如何做到的,我认为任何人都无法在公共论坛上告诉你我怎么认为这可以管理。因此,如果您想确保将库存精确映射到订单,则必须锁定库存。如果您打算这样做,那么问题就在于你锁定的地方。当商品被添加到购物车时,当用户付款或付款完成时。但锁定的问题是它会让你的系统变慢。所以这是你应该避免的。

休息你在问题中已经涵盖的所有选项,归结为权衡。

首先,用户体验将受到影响,您还需要承担交易成本。

第二个选项要求您准备好下注或超卖。当你保留储备金时,你基本上都在说我会贬低。这也可能适得其反,因为你决定预订5件物品,但是你会得到20个并行请求结账和付款,你将回到正方形。但是在大多数情况下它都会有所帮助,因为你愿意受到打击。

在结账时进行库存检查可以帮助您获得更好的库存分辨率,但是当您确实在库存中有最后一个项目并且10个人在其上进行结帐时,它将无济于事。阅读电话即使两个这样的请求重合,你会给他们库存并回到原点。

所以我在这种情况下做的是1.我的库存不是数字而是枚举,即关键,低,中,高,非常高根据一些分析,我们配置库存检查。对于高和非常高,我们将不会进行任何检查并预订该项目。对于关键,我们采取锁定。 (不完全是数据库锁定,但我们为它们保留了库存),对于低和中等我们检查库存并继续进行,如果我们有足够的。所有这些值都是可配置的,可帮助我们减轻我们的情况。

我们正在尝试的另一件事是将库存分配给库存经纪人,并将库存代理分配给一组服务以查看此库存。即使我们在一个经纪人上保留库存,其他人也可以继续自由销售。经纪人定期更新库存主数据库存状态。它像库存大师有50个项目,每个分配5个到10个。 10分钟后他们回来了,如果他们需要更多库存,他们会要求它,如果他们遗留下来(如果发生故障)他们会将库存退回给主人,以便将其分配给其他人。

上述方法无法帮助您准确地解决问题,但它为您提供了如何管理库存的一定自由度。


0
投票

考虑做:

  1. 在付款页面上,您应该重新检查产品是否仍然可用。这可以是一个简单的HTTP GET。
  2. 如果GET调用对您来说很慢,请考虑将用户添加的最新产品缓存到某些内存数据库(例如REDIS)。现在,如果第一个用户成功处理付款,请在redis中减少该产品ID的计数器。在继续为第二个用户付款之前,请在redis中检查该产品ID的计数器。

(BONUS:Redis提供原子操作,因此您也可以在订购产品时成功处理竞争条件。)

© www.soinside.com 2019 - 2024. All rights reserved.