[英]Database access for concurrent API requests
如何確保數據庫調用與並發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對此有好處嗎?
任何指向正確方向的指針將不勝感激。
解決方案是使用互斥鎖來同步關鍵塊。
我用了異步鎖
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
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.