2012-08-03 7 views
32

यह ऐसा कुछ है जो मेरे लिए थोड़ा अस्पष्ट है (मैं सिर्फ नोड और मोंगो के साथ शुरू कर रहा हूं), और यह वास्तव में सर्वर प्रदर्शन और तनाव के कारण मुझे चिंतित करता है (जो मुझे लगता है कि एक और सवाल है, लेकिन मैं कि पद के अंत में)।Node.js पर MongoDB कनेक्शन के लिए सबसे अच्छा अभ्यास क्या है?

तो, यह सोचते हैं मैं Node.js और Restify, जहां प्रत्येक एपीआई endpoint एक समारोह से मेल खाती है के साथ एक एपीआई लिख रहा हूँ, चाहिए मैं:

क) db कनेक्शन खोलने और एक वैश्विक में संग्रहीत var, और फिर बस हर समारोह में इसका उपयोग करें?
उदाहरण:

// requires and so on leave me with a db var, assume {auto_reconnect: true} 
function openDB() { 
    db.open(function(err, db) { 
     // skip err handling and so on 
     return db; 
    } 
} 

var myOpenDB = openDB(); // use myOpenDB in every other function I have 

ख) db कनेक्शन खोलने और फिर बस एक विशाल बंद में सब कुछ डाल दिया?
उदाहरण:

// same as above 
db.open(function(err, db) { 
    // do everything else here, for example: 
    server.get('/api/dosomething', function doSomething(req, res, next) { // (server is an instance of a Restify server) 
     // use the db object here and so on 
    }); 
} 

ग) खुला और डाटाबेस हर बार यह आवश्यक है बंद?
उदाहरण:

// again, same as above 
server.get('/api/something', function doSomething(req, res, next) { 
    db.open(function(err, db) { 
     // do something 
     db.close(); 
    }); 
}); 

server.post('/api/somethingelse', function doSomethingElse(req, res, next) { 
    db.open(function(err, db) { 
     // do something else 
     db.close(); 
    }); 
}); 

यह पिछले एक मैं अंतर्ज्ञान से बाहर क्या करेंगे है, लेकिन एक ही समय में मैं पूरी तरह से आराम से यह कर नहीं लग रहा है। क्या यह मोंगो सर्वर पर ज्यादा तनाव नहीं डालता है? विशेष रूप से जब (और मुझे उम्मीद है कि मैं उस पर पहुंच जाऊंगा) यह सैकड़ों हो जाता है - अगर हजारों नहीं - इस तरह की कॉल?

अग्रिम धन्यवाद। (दी इस बहुत संभावना नहीं है)

+1

ध्यान दें कि विकल्प बी के लिए, आप आसानी से नामित कार्यों का उपयोग करके बड़े पैमाने पर बंद होने से बच सकते हैं, इस प्रकार कॉलबैक नरक से परहेज कर सकते हैं। उस ने कहा, यदि आप नोड का उपयोग कर रहे हैं, तो आप मॉड्यूल का उपयोग कर रहे हैं (मुझे उम्मीद है!) जिसका मतलब है कि (कुछ छोटी संख्या घोषित!) वैश्विक चर है - वे किसी और के नामस्थान को प्रदूषित नहीं करेंगे, क्योंकि कुछ भी नहीं छोड़ता है आपके मॉड्यूल के निर्यात को छोड़कर '.js' फ़ाइल। – Gijs

+0

धन्यवाद! तो क्या आप सुझाव देते हैं कि मैं विकल्प बी का उपयोग करता हूं? मैं ड्राइवर के [Google समूह] (https://groups.google.com/forum/?fromgroups#!forum/node-mongodb-native) के आस-पास खुदाई कर रहा हूं और हर कोई ऐसा लगता है कि कुछ प्रकार के कनेक्शन पुनः उपयोग (उनमें से ज्यादातर वास्तव में विकल्प बी जैसे कुछ सुझाव देते हैं)। – ArturoVM

+0

दूसरी ओर, मैंने कहीं पढ़ा है कि एक ही कनेक्शन के तहत सब कुछ कर रहा है, नोड की एसिंक प्रकृति के उद्देश्य को हरा रहा है। – ArturoVM

उत्तर

11

मुझे MongoJS बहुत पसंद है। यह आपको मोंगो को डिफ़ॉल्ट कमांड लाइन के समान तरीके से उपयोग करने देता है और यह आधिकारिक मोंगो ड्राइवर पर सिर्फ एक रैपर है। आप केवल एक बार डीबी खोलते हैं और निर्दिष्ट करते हैं कि आप किस संग्रह का उपयोग करेंगे। यदि आप --harmony-proxies के साथ नोड चलाते हैं तो आप संग्रह को भी छोड़ सकते हैं।

var db = require('mongojs').connect('mydb', ['posts']); 

server.get('/posts', function (req, res) { 
    db.posts.find(function (err, posts) { 
    res.send(JSON.stringify(posts)); 
    }); 
}); 
+0

मैं वास्तव में इसे प्यार करता हूँ! : डी बहुत बहुत धन्यवाद। लेकिन, जैसा कि मैंने अपने उत्तर की टिप्पणियों में गिज से कहा था, मैंने कहीं पढ़ा है कि उसी कनेक्शन के तहत सबकुछ कर कोड को अवरुद्ध करने के परिणामस्वरूप। क्या आप जानते हैं कि यह सच है? – ArturoVM

+0

मुझे ऐसा नहीं लगता है। यह उद्देश्य को हरा देगा। मेरा मानना ​​है कि डेटाबेस से कनेक्शन सॉकेट के माध्यम से किया जाता है। सॉकेट नेटवर्क पर कुछ करता है जो धाराओं के साथ फ़ाइलों को पढ़ने के दौरान नोड करता है। एक रीडस्ट्रीम फ़ाइल को छोटे टुकड़ों में पढ़ता है और जब उन्हें प्राप्त होता है तो घटनाओं को आग लगती है। मुझे लगता है कि नेटवर्क के टुकड़ों के साथ सॉकेट वही करते हैं। Http://nodejs.org/api/net.html#net_class_net_socket – juandopazo

+0

अवरुद्ध या गैर-अवरुद्ध API पर निर्भर करता है। तो उपर्युक्त उदाहरण ऐसा लगता है कि यह इस अर्थ में अवरुद्ध होगा कि 'server.get (...)' निष्पादित नहीं होता है जब तक आप सफलतापूर्वक डीबी से कनेक्ट नहीं होते (यह पूरी तरह से ऐसा लगता है; मैं परिचित नहीं हूं MongoJS के साथ)। हालांकि, आपको शायद कुछ भी * करने के लिए डीबी की आवश्यकता है, यह आवश्यक नहीं है कि यह सब बुरा हो, हालांकि यदि आपके पास इनमें से कई निर्भरताएं हैं जो निष्पादित करने में काफी समय लेती हैं, तो वायदा/@scttnlsn के समाधान में वादे/कॉलबैक। – Gijs

6
  • विकल्प ए एक महान विचार के बाद से वहाँ कोई गारंटी नहीं कि डीबी उद्घाटन समाप्त किए जाने से पहले एक HTTP अनुरोध नियंत्रित किया जाता है नहीं है
  • विकल्प सी भी बेकार में यह बाद से आदर्श नहीं है डीबी कनेक्शन खोलता है और बंद करता है

जिस तरह से मैं इसे संभालना पसंद करता हूं वह स्थगित/वादे का उपयोग कर रहा है। विभिन्न वादा नोड के लिए उपलब्ध पुस्तकालयों का एक गुच्छा रहे हैं लेकिन मूल विचार कुछ इस तरह करना है:

var promise = new Promise(); 

db.open(function(err, db) { 
    // handle err 
    promise.resolve(db); 
}); 

server.get('/api/something', function doSomething(req, res, next) { 
    promise.then(function(db) 
     // do something 
    }); 
}); 

मेरा मानना ​​है कि नेवला एक तरीका है कि मोटे तौर पर यह जैसा दिखता में कनेक्शन संभालती है।

+0

से संबंधित है धन्यवाद। मैंने मोंगोस में देखा और स्पष्ट रूप से यह आधिकारिक चालक से बहुत अलग चीजें नहीं करता है। जब यह कनेक्शन खोलने को समाप्त होता है तो यह सिर्फ एक घटना को सक्रिय करता है, और जब यह कनेक्ट नहीं होता है तो यह बफर ऑपरेशन करता है ताकि आपको इसके बारे में चिंता न करें। मैं वादे की बात देखता हूं, हालांकि :) – ArturoVM

+0

नीचे प्रस्तुत लाइब्रेरी, मोंगोजेएस वास्तव में वादे का उपयोग करने का एक बेहतर उदाहरण है (हालांकि उन्हें वायदा कहा जाता है)। – scttnlsn

संबंधित मुद्दे