0

我正在做一个项目,我们遇到了问题,我们N在特定时间有可用的票数。我们从后端 REST API 提供服务,人们以先进先出的方式购买它。这就像买家之间的竞赛。

问题:

目前我们正在处理它,首先我们从用户那里取钱(我们先取钱,因为客户的银行交易可能由于某种原因而失败,所以我们确认我们没有丢失任何东西)然后进行确认电子邮件,但我们遇到了超额预订问题。因为我们已经拿了钱,但没有可用的票,因为同时有人买了它。所以我们必须给那个客户票,这导致我们超额预订。

我想解决它。我对此提出了一些想法。

第一个解决方案:

我想出的第一个解决方案是我有一个 API,它最初会检查是否有足够的门票可供出售,如果有,它会从可用门票中减去门票数量并要求客户付款。一旦付款得到确认,我们将发送客户确认电子邮件。如果失败,我们会将这些减去的票添加到可用票的数量中。它显然似乎有效,但它有一些缺陷。

例如,如果用户决定不进行任何银行交易或他的浏览器崩溃等,我们可能会永久丢失门票。

第二种解决方案:

第二种解决方案是使用 Django 会话,一旦我们确认我们将提交数据库事务,该会话将通过从可用票中减去用户购买的票数来临时保存信息。如果没有,我们可以回滚。我相信它会打破 RESTful API 的无状态属性。

问题:

我们有解决这个问题的标准方法吗?我在互联网上搜索了我没有找到任何解决方案,如果这个问题是从另一个名字知道的并且已经有一个可以按原样使用的标准解决方案,请告诉我。如果没有,请分享您的知识和经验。

4

1 回答 1

0

我迟到了,但我设法解决了这个问题。为了解决这个问题,我使用了 django 信号。这是两步程序。

首先,我在 states 中添加了Transactionstates,即confirmed, cancelled, reserved, expired.

  1. 用户将调用/reserve端点,这将创建一个交易,该交易将减去票证,但处于reserved状态。它将从活动的可用门票中减去预订门票的数量。on_create信号将启动一个celery任务,该任务将在 5 分钟后运行,因此在 5 分钟后,如果这些票已过期,它将添加回来。

  2. 用户将进入下一步,他将从端点确认交易/purchase。所以现在我们将交易标记为confirmed状态。

有一个/cancel端点将明确取消票证。

这样做的缺点是有人可能会通过将票保持在保留状态来滥用系统(显然这是极少数情况)。

于 2022-01-21T17:20:24.550 回答