gpt4 book ai didi

node.js - NodeJS 和 Mongo - 多个用户同时发送请求时的意外行为

转载 作者:可可西里 更新时间:2023-11-01 09:27:31 26 4
gpt4 key购买 nike

我们一直在使用 NodeJS 和 mongo(通过 mongoose)来执行非常简单的 save()。我们有一个名为“亮点”的模型,其中包含一个引用“响应”的 ObjectId 数组。

这是高亮模型声明的相关部分

var highlightSchema = Schema({
[...]
, responses: [{type: ObjectId, ref: 'Response'}]
[...]
});

我们通过首先保存响应对象,然后将其插入突出显示对象,然后保存突出显示对象,将响应插入突出显示。很直接,如下:

      Highlight.findOne({[...]}, function(err, highlight) {
var response = new Response({[...]});
response.save(function(err) {
if(!err) {
highlight.responses.push(response)
highlight.save(function(err) {
[...]
})
}
});
});

在 99% 以上的时间里,这完全符合预期。 (注意:您可以安全地假设上述代码中的“highlight”变量确实包含一个有效的 Highlight 对象)

但是,由于许多此类确切请求是同时提出的,因此我们在高峰时段遇到的孤立问题越来越多。在一种情况下,一个 Response 被成功创建,但是一个不同的 Response 被推送到 highlight.responses 数组中。

这两个 Response 的时间戳显示它们的创建时间间隔大约 30 毫秒。一切都完全按照预期创建,除了 Highlight 对象中数组的内容。

因为我目前也在研究很多操作系统的东西,所以我的第一个想法是这可能是某种同步问题。但是 node 是单线程的,我觉得我对 nodejs 的事件循环是如何工作的没有很好的理解,我什至不完全相信这就是问题所在。

如果您有任何想法,或者我是否已经足够清楚地解释这一点,请告诉我。我很乐意详细说明。

谢谢!

最佳答案

您遇到了并发问题。模式建模的方式无法确保原子性,因此会出现您遇到的问题。

避免此类问题并确保原子性的最佳选择是将 Responses 模型嵌套到 Highlights 模型中。

这样您就可以通过将 Response 元素直接插入 Highlight 模型的 Responses 属性来仅使用 Highlights 模型。

这是确保 MongoDB 原子性的唯一方法。

所以你会有这样的东西:

   +----------------------+
| Highlight model |
+----------------------+
| _id 1 |
| |
| property 1: 'abc' |
| property 2: 'bla' |
| property 3: 123 |
| responses:[ |
| +----------------+ |
| | Response _id 1 | |
| +----------------+,|
| | Response _id 2 | |
| +----------------+,|
| | Response _id 3 | |
| +----------------+,|
| | Response _id n | |
| +----------------+]|
+----------------------+

不确定如何使用 Mongoose 执行此操作,但在 mongo shell 中,如果您想使用 _id ObjectId('1234') 添加对 Highlight 对象的响应,您将执行如下操作:

    db.highlights.update({_id: ObjectId('1234')},{$push:{Responses: {"Your response object"}}});

$push reference from MongoDB documentation

我很确定您一定能够以更简单的方式使用 Mongoose 完成此操作,可能只需要浏览它的文档即可。

关于node.js - NodeJS 和 Mongo - 多个用户同时发送请求时的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22262114/

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