我正在学习微服务,并试图设计一个电子商务网站。我无法弄清楚大型购物网站会处理购物车问题中的最后一项。
例如,我从亚马逊选择了一个库存中只有一个项目的项目。我从两个不同的帐户登录,然后将商品放入购物车。我什至从帐户和网站都进入了付款页面,并没有在任何地方限制我说该商品不可用。我不确定在从两个帐户进行付款时的付款页面之后,亚马逊将如何处理它。
我想到的解决方案很少:
如果您已经解决了类似的问题并解决了一些问题,请分享。如果需要更多详细信息,请告诉我。
答案 0 :(得分:2)
我无法回答Amaozon的工作方式,也不能相信任何人都可以在公共论坛上告诉我如何管理。 因此,如果要确保将库存准确映射到订单,则必须锁定库存。如果您打算这样做,那么问题将出在哪儿。当将商品添加到购物车时,当用户付款或完成付款时。但是锁定的问题在于它将使您的系统运行缓慢。 所以这是您应该避免的事情。
休息所有您已经在问题中涵盖的选项,然后归结为权衡。
首先,用户体验会受到影响,您还需要承担交易费用。
第二个选项要求您准备好超卖或超卖。 当您保留储备金时,您基本上是在说我会卖空。这也可能适得其反,因为如果您说要保留5件商品,但同时收到20个要求结帐和付款的请求,您将回到第一位。但是,只要您愿意受到打击,它就可以在大多数情况下提供帮助。
在结帐时进行库存检查可以帮助您更好地解决库存问题,但是当您确实有库存中的最后一项并且有10个人对其进行结帐时,将无济于事。即使有两个这样的请求,读取呼叫也会同时发生,您将给他们库存并回到平方。
所以在这种情况下我要做的是 1.我的库存不是数字,而是枚举,即严重,低,中,高,非常高 根据某些分析,我们配置库存检查。对于较高和非常高的项目,我们将不进行任何检查和预订。对于关键,我们采取了锁定措施。 (不完全是数据库锁,但我们为它们保留库存),对于中低档,我们检查库存并在有足够资源的情况下继续进行。所有这些值都是可配置的,可帮助我们缓解现有的情况。
我们正在尝试的另一件事是将库存分配给库存经纪人,并将库存经纪人分配给一组服务以查看此库存。即使我们将库存保留在一个经纪人上,其他经纪人也可以继续自由销售。那里的经纪人会定期向库存主更新有关库存状态的信息。像库存主数据一样,它有50个项目,它向所有十个项目分配5个项目。 10分钟后,他们又回来了,如果他们需要更多的库存,他们会要求它,如果剩下的(如果发生故障),他们会将库存退回给主服务器,以分配给其他人。
以上方法无法帮助您准确地解决问题,但是可以让您在如何管理库存方面有一定的自由度。
答案 1 :(得分:0)
考虑这样做:
在付款页面上,您应重新检查该产品是否仍然可用。这可以是一个简单的HTTP GET。
如果GET调用对您来说很慢,请考虑将用户添加的最新产品缓存到某些内存数据库(例如REDIS)中。现在,如果第一个用户成功处理了付款,请减少Redis中该产品ID的计数器。并且在为第二个用户付款之前,请在redis中检查该产品ID的计数器。
(奖金:Redis提供原子操作,因此您也可以在订购产品时成功处理竞争条件。)