在电子商务网站中将并发管理到篮子的最佳实践


19

管理两个客户同时添加库存仅为1个产品的情况的最佳实践是什么?

必须在购物篮的代码中进行检查,以避免这2个客户之一添加相同的产品?

还是必须在付款阶段执行此检查,例如进行第二次查询以确认相关产品仍在库存中(即并发客户尚未购买的产品)?


一些网站,例如剧院门票预订,在处理订单时会限时为您保留该商品
Brad Thomas

Answers:


11

这个问题没有完美的答案,而且都取决于细节。

作为第一道“防线”,我将尽量避免出现这种情况,方法是根本不出售任何可能的低价物品。如果可能,则取决于情况和要出售的物品的种类。在我工作的公司中,大多数文章都是在网站缺货之前从网站上删除的。但我们出售的是整笔交易,剩下的几件商品则由我们的销售人员作为特价出售。对于小型商店,这可能不是一个选择,尤其是在出售高价商品时。

在向篮子里添加东西时进行仔细检查的解决方案不是很好。人们在没有实际下订单的情况下将很多东西放在篮子里。因此,这可能会在一段时间内阻塞本文。

因此,以我对小型工作的拙见,最好的方法是在实际下订单时在付款前做最后检查。在最坏的情况下,您必须告诉客户您现在缺货了(小型商店很少会发生这种情况)。


不错的选择-库存低且价格高
rohanagarwal

5

我认为最佳做法是选择以下哪个选项更适合特定的业务案例

  1. 乐观离线锁

    ... 通过验证一个会话即将提交的更改与另一会话的更改不冲突,解决了这个问题(会话冲突问题)。从某种意义上说,成功的提交前验证是获得一个锁,表明可以继续进行记录数据的更改。只要验证和更新发生在单个系统事务中,业务事务就会显示出一致性。

  2. 悲观的离线锁
    ...通过完全避免冲突来防止冲突。它迫使业务交易在开始使用数据之前获得对数据的锁定,因此,在大多数情况下,一旦开始业务交易,您就可以确定将完成它而不会被并发反弹控制...
“悲观的脱机锁假定会话冲突的可能性很高,因此限制了系统的并发性,而乐观的脱机锁假定冲突的可能性很低。对会话冲突的期望不太可能允许多个用户使用相同的数据同时进行。”


5

这是一个人的问题,还有一个数据库问题,数据库锁定很容易!

鉴于客户可能永远都不会结帐...

您有两个基本选择:

  • 在客户将商品添加到购物篮中之后,您需要为商品预留固定的时间(例如20分钟)–在他们需要时间之后,他们必须重新检查库存水平或重新开始。这通常用于为活动或飞机座位出票。

  • 或者您说类似“ 在24小时内分派xxx 普通 ”,但在结帐时保留库存,在这种情况下,如果某些物品有库存,则必须让他们在结帐后取消订单。(绿色,黄色,红色的库存水平也可以正常工作,或者某些网站将其降至1或2时说“低库存”)


2

与往常一样,这取决于您的要求。如果您是亚马逊公司,每天售出100,000,000件商品,那么抢先检查和锁定的开销可能是令人望而却步的,而每天一位顾客毕竟没有得到他们的商品的问题可以忽略不计。如果您交易的是独特而昂贵的稀有古董宗教图标,则可能恰恰相反。您自己必须知道您的业务案例在该范围内的位置。


2

在我们的例子中,我们使用消息队列来处理订单并将其配置为仅以FIFO方式一次只处理同一产品上的一个作业。

需要注意的是,您要在整个订购过程中增加新的开销,这会延迟一些时间。


您将队列限制为只能由一个消费者使用
rohanagarwal

1

对于用户而言,最佳实践显然是确保第二次添加失败。但是,由于0.1%的情况,这会使您的整个网站变慢。

技术上最有效的解决方案,也是使销售最大化的解决方案,是让它成功,然后稍后再履行两个订单-只是因为您现在没有库存,并不意味着您找不到它在紧急情况下。如果您不能这样做,那么有人必须联系幸运的用户并道歉。但这正是导致今年圣诞节前引起轩然大波的原因(这不是唯一出现的文章,因此对百思买表示歉意,但这是我发现的第一篇)。

您的工作是向企业介绍所有方案,并取其优点和缺点,然后让它们根据您的建议进行决策​​。如果他们偶尔能为声誉带来一点点损失,以使销售最大化,那么就足够公平了;如果他们做不到,而且流量太低,以至于您可以快速检查两次更新,那也是他们的要求。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.