【问题标题】:Tracking an order ID with node.js & MongoDB使用 node.js 和 MongoDB 跟踪订单 ID
【发布时间】:2020-12-01 00:13:55
【问题描述】:

所以我有一个奇怪的问题,这几天我一直在摸索,我似乎无法找到任何在线解决方案。

我正在移动应用程序上开发一种订购服务,每次下订单时都会使用唯一的 orderID。

每天,订单 ID 基值重置回 100,然后当当天下订单时,它会递增:101、102、103、104 等。

我的 OrderID 是根据名为 orders 的集合中的“活动订单”数量计算得出的,+1。因此,如果有 5 个有效订单,则返回给客户的新订单 ID 为 106。除了一个问题之外,这工作正常:

  • 我的 node.js API 有 4 个实例同时工作,以平衡负载。
  • 所有这些节点都连接到同一个 mongo 数据库。

因此,如果两个订单并行下达,实例 1 和 2 分别接受一个订单,都询问数据库有多少“活动订单”,显然它们都得到相同的值,因为它几乎发生在同时。因此,它们都返回相同的订单 ID,然后我们就有两个具有相同订单 ID 的客户。

如果我将设置减少到一个实例,那么这将非常完美,因为它消除了订单并行运行的可能性。但是,对于 HA 和负载平衡,我需要能够使用多个实例水平扩展。

是否有避免这种情况的标准做法?有没有更好的方法来跟踪这样的 orderID?

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: javascript node.js mongodb mongoose nosql


    【解决方案1】:

    您可以使用互斥锁来防止同时访问资源。所以基本上,当锁空闲(解锁)时,进程将可以访问。否则,它将等到它可以免费使用。你可以在这里找到一个为你做这件事的模块:locks

    编辑:

    另一种解决方案可能会阻止您拥有的 4 个实例的并行处理。所以你可以做的是你也可以为此实现一个基于队列的方法。这是一个可以帮助您的模块:MongoDB-Queue 你也可以参考这篇文章:Medium-MongoDB-Queue

    【讨论】:

    • 您好,感谢您的回答 - 这看起来不错,但在操作期间我预计会有 100 个订单,那么这种“锁定”会破坏我的水平扩展和并行运行订单的目的吗?
    • 嗯,一次运行一个事务不应该花那么长时间来处理,所以从技术上讲,并行效应应该仍然存在。您仍然可以尝试,否则,您可以使用 FIFO 方法实现自己的“队列”。我将编辑我的答案。
    • 基于队列的方法正是我一直在寻找的,也解决了我知道我会接触到的另一个未来问题 - 所以谢谢!
    【解决方案2】:

    您可以实现负载平衡,但仍然可以防止来自同一客户的订单转到多个实例,方法是在实际处理程序之前设置一个自定义层,将特定客户的请求仅路由到特定节点。这可以通过对客户 ID 进行散列和模运算,然后确定应该路由到的节点来完成。由于这个“路由器”层基本上只是一个自定义代理,不做额外的处理——应该不会对性能产生任何影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      相关资源
      最近更新 更多