【问题标题】:Handle Express requests one at a time一次处理一个请求
【发布时间】:2020-07-12 18:06:32
【问题描述】:

在 Express 中,是否可以处理对单个路由的请求一次一个?我有一个“结帐队列”,每次创建结帐时,库存都会减少。但是,同时创建结帐的POST 请求检查库存之前在第一个请求中减少,这导致超卖。 注意:请求只需要大约 300 毫秒,因此使用 Bull 或任何其他排队技术似乎有点过头了。 有什么方法可以配置路由以一次性接受请求一次?

我使用 Firestore 作为数据存储。

【问题讨论】:

  • 您使用哪个数据库/存储?绝对应该在那里处理,而不是在应用程序级别。
  • @Animir 我使用 Firestore,但不幸的是,更新数据库和获取文档也是异步的。
  • 看起来,你应该使用transactions
  • @Animir 我发誓,这个网站上每隔一段时间就会有人给出一个该死的答案,这让我很高兴。谢谢一百万:)
  • @BenBotvinick 您能否为您的问题提供代码解决方案,以便我们了解您的尝试。

标签: node.js express google-cloud-firestore


【解决方案1】:

检查下面的 npm 模块,您可以将其用作中间件

https://www.npmjs.com/package/express-rate-limit

【讨论】:

  • 这没有回答问题。我的目标不是限制来自 1 个 IP 的传入请求,而是一次处理来自所有客户端的每个请求。
  • @BenBotvinick 你可以使用RateLimiterQueue,但如果可能的话,最好在商店级别进行原子更新。
【解决方案2】:

Node.js 本质上是一个单线程应用程序,因此它不能一次执行多个请求。它的事件循环内部发生了什么,它可以将回调添加到事件队列中。

您可以使用async/await 范式来处理多个请求。

【讨论】:

  • 是的。但是异步请求是在该事件循环之外同时处理的。
  • 节点是单线程的。请求异步排队,事件循环一一处理请求。您将异步行为与非阻塞 IO 行为混淆
  • 好的,我如何将它应用到我的问题中?
  • 检查这个答案以获得上下文stackoverflow.com/questions/47172684/…
  • 两个异步请求可以在存储级别创建竞争条件。
【解决方案3】:

您应该在商店级别使用阻塞操作,例如 Firestore 的 transactions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2012-03-18
    • 2019-03-30
    • 2021-02-11
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多