gpt4 book ai didi

node.js - 如何防止 mongodb 支持的分布式 Nodejs Web 服务器架构中的竞争条件

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:28 24 4
gpt4 key购买 nike

这是我的问题的描述:

  1. 我在负载均衡器后面有 x 个用 Node.js (express.js) 编写的 Web Worker。这些工作人员将数据写入 mongodb (mongoose.js)
  2. 我已经设置了端点 y,以便在处理程序的中间件链中的某个时刻我正在执行以下逻辑:如果请求用户存在于数据库中,则获取它,更新一些字段,然后将其存储回来。如果不存在,则插入到mongo中。

注意!由于域特定的逻辑,我无法使用 Mongoose 的 findAndUpdateOne() - 这将是原子的。如果用户已经存在,则使用特定值更新它,否则使用另一个值插入它。

  1. 问题是,来自同一用户(数据库中尚不存在)的两个请求通常会遇到两个不同的工作人员。当用户处理中间件启动时,两个工作人员都会确定该用户不存在并尝试插入它然后更新它。当然,这会导致错误,例如。验证错误:我已为每个用户验证和其他设置设置了唯一的电子邮件。

如何防止这种情况发生?

最佳答案

您可以使用 $set$setOnInsert 更新运算符来实现这一点。

来自MongoDB $setOnInsert docs :

If an update operation with upsert: true results in an insert of a document, then $setOnInsert assigns the specified values to the fields in the document. If the update operation does not result in an insert, $setOnInsert does nothing.

If the db.collection.update() with upsert: true had found a matching document, then MongoDB performs an update, applying the $set operation but ignoring the $setOnInsert operation.

所以,这应该可以解决问题:

var now = Date.now();

Users.update({ _id: 1 }, {
$set: { updatedAt: now },
$setOnInsert: { createdAt: now }
}, {upsert: true}, function(err, doc) {

// resultant doc is available here

})

关于node.js - 如何防止 mongodb 支持的分布式 Nodejs Web 服务器架构中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18415066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com