多个服务器上的计时器状态

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

我遇到了一个小的架构问题,希望有一个解决方案。

我有一个销售库存有限的产品的网站,一旦客户单击购买按钮,我的服务器就会更新数据库,就好像他购买了什么以及购买了多少的标志,以防他取消。

产品为客户保存75秒。

如果 75 秒计时器过去或他取消/离开网站,我会将购买和数据库恢复到购买前的原始状态。

如果收到付款,我会取消计时器。

机制复杂的原因是购买操作无法立即进行(我使用第三方加密服务接收付款,从在网站上点击购买到实际付款可能需要几秒钟的时间)已制作)

此解决方案适用于只有一台服务器的情况,但 75 秒计时器在服务器上保存为普通变量。也就是说,在有多个服务器的情况下,可以在一个服务器上创建一个计时器,并将实际的购买操作发送到另一台服务器,该服务器将无法取消恢复购买的计时器,或者如果服务器崩溃以及随之而来的所有变数。

还有其他方法可以实现这一点吗?有没有一种工具可以将所有计时器保存在一个永久位置?

这个变量是一个包含所有 setTimeout 计时器的对象:

let timeouts = {}

当用户打算购买时,我更新数据库并执行以下操作:

timeouts = { ...timeouts, [buyerAddress]: setTimeout(() => restoreBuy(buyerAddress), 75000) }

如果我收到付款,我会取消超时:

clearTimeout(timeouts[buyerAddress])

restoreBuy 功能在用户取消或 75 秒后激活。它将用户对象恢复到购买前的状态。

javascript node.js server architecture
1个回答
0
投票

为每个服务器中的每次购买创建/维护计时器听起来是非常糟糕的做法。我认为你应该考虑改变你的解决方案,转向多服务器架构。

通常,我们在数据库级别处理这些问题,例如,您可以使用事务来阻止您使用的行上的任何其他更新,将库存减少 1 一点,也许在您更新的行上保留某种标志等.这取决于您使用的技术和您的用例。此外,这还会引发有关“竞争条件”的问题,您必须根据自己的技术堆栈来处理这些问题。

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