कोई कैसे सुनिश्चित कर सकता है कि समवर्ती एपीआई कॉल के लिए डेटाबेस कॉल एसिंक्रोनस हैं?

उदाहरण के लिए, मेरे पास यह मॉडल है जो पूल का प्रतिनिधित्व करता है।

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

मैं चाहता हूं कि किसी भी समय, डीबी में केवल 1 गैर-पूर्ण पूल हो। तो मेरे पास ऐसा कुछ है जो एपीआई कॉल पर चलता है।

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 अनुरोध भेजता हूं, तो उनमें से प्रत्येक को लगता है कि वे पहले हैं और फिर एक नया पूल बनाते हैं। तो मैं नए १० पूल के साथ समाप्त होता हूं जहां मुझे ५ उपयोगकर्ताओं के २ पूर्ण (बंद) पूल की उम्मीद थी।

क्या यह सुनिश्चित करने का कोई तरीका है कि ये सभी अनुरोध क्रमिक रूप से निष्पादित हों?

शायद क्रमिक रूप से एक बुरा विचार है। लेकिन कुल मिलाकर, मैं डीबी की स्थिति को हमेशा वैध रखने का एक तरीका ढूंढ रहा हूं।

क्या Nodejs इसके लिए अच्छा है?

सही दिशा में किसी भी संकेतक की बहुत सराहना की जाएगी।

1
Acha Bill 4 जून 2019, 05:46

1 उत्तर

सबसे बढ़िया उत्तर

समाधान महत्वपूर्ण ब्लॉक को सिंक्रनाइज़ करने के लिए म्यूटेक्स का उपयोग करना था।
मैंने 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
    });
}          
0
Acha Bill 29 जून 2019, 03:13