gpt4 book ai didi

javascript - 并发 API 请求的数据库访问

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:56 26 4
gpt4 key购买 nike

如何确保数据库调用对于并发 API 调用是异步的?

例如,我有一个代表池的模型。

{
limit: number e.g 5
isOpen: boolean // will close when users.length == limit
users: []
}

我希望在任何给定时间,数据库中只有 1 个非满池。所以我有类似这样的东西,可以在 API 调用上运行。

let openPool = model.findOne({isOpen: true});
if(!openPool){

//create a new pool
model.insert({
limit: 5,
users: [currentuser]
isFull: false
});
}else{

//add the current user to existing open pool
model.update({
users: {$push: {currentuser}}
});

//close pool if full
if(model.users.length == model.users.limit){
model.update({
isOpen: {$set: false}
});
}

}

当我同时向此端点发送 10 个请求时,每个请求都认为自己是第一个,然后创建一个新池。因此,我最终得到了 10 个新池,而我预计有 2 个完整(封闭)池,每个池有 5 个用户。

有没有办法确保所有这些请求按顺序执行?

也许顺序是一个坏主意。但总的来说,我正在寻找一种方法来保持数据库的状态始终有效。

Nodejs 适合这个吗?

任何指向正确方向的指示将不胜感激。

最佳答案

解决方案是使用互斥体来同步关键 block 。
我用过async-lock

var AsyncLock = require('async-lock');
var lock = new AsyncLock();

requestHandler(){
return new Promise(async (resolve,reject) => {
lock.acquire('key', async () => {
let openPool = await model.findOne({isOpen: true});
if(!openPool){

//create a new pool
await model.insert({
limit: 5,
users: [currentuser]
isFull: false
});
}else{
//add the current user to existing open pool
await model.update({
users: {$push: {currentuser}}
});

//close pool if full
if(model.users.length == model.users.limit){
model.update({
isOpen: {$set: false}
});
}
}

return resolve(true);
}).then(() => {
//lock released
});
}

关于javascript - 并发 API 请求的数据库访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56436744/

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