मैं modeodb (2.2.2) के साथ node.js को देशी node.js ड्राइव का उपयोग करके 10gen तक कोशिश करता हूं।मोंगोब कनेक्शन से निपटने का सही तरीका क्या है?
पहले सब कुछ ठीक हो गया। लेकिन जब समेकन बेंचमार्किंग भाग में आते थे, तो कई त्रुटियां हुईं। लगातार कनेक्ट/बंद 1000 concurrencies साथ कारण हो सकता है MongoDB तरह त्रुटि के साथ किसी भी आगे अनुरोधों को अस्वीकार कर:
Error: failed to connect to [localhost:27017]
Error: Could not locate any valid servers in initial seed list
Error: no primary server found in set
इसके अलावा, अगर स्पष्ट पास बिना ग्राहकों शटडाउन का एक बहुत है, यह पता लगाने और उन्हें बंद करने के लिए MongoDB मिनट लगेंगे। जो समान कनेक्शन समस्याओं का भी कारण बन जाएगा। (कनेक्शन स्थिति की जांच के लिए /var/log/mongodb/mongodb.log का उपयोग करना)
मैंने बहुत कोशिश की है। मैनुअल के मुताबिक, मोंगोडब में कनेक्शन सीमा नहीं है, लेकिन पूलसाइज विकल्प मेरे लिए कोई प्रभाव नहीं पड़ता है।
जैसा कि मैंने नोड-मोंगोड-मूल मॉड्यूल में केवल इसके साथ काम किया है, मुझे पूरा यकीन नहीं है कि अंततः समस्या का कारण क्या हुआ। अन्य भाषाओं और ड्राइवरों में प्रदर्शन के बारे में क्या?
पीएस: वर्तमान में, स्वयं रखरखाव पूल का उपयोग करना एकमात्र समाधान है जिसे मैंने पाया, लेकिन इसका उपयोग करके प्रतिकृति सेट के साथ समस्या का समाधान नहीं हो सकता है। मेरे परीक्षण के मुताबिक, प्रतिकृति सेट लगता है कि स्टैंडअलोन मोंगोडब बहुत कम कनेक्शन लेता है। लेकिन यह नहीं पता कि ऐसा क्यों होता है।
कन्करेंसी परीक्षण कोड:
var MongoClient = require('mongodb').MongoClient;
var uri = "mongodb://192.168.0.123:27017,192.168.0.124:27017/test";
for (var i = 0; i < 1000; i++) {
MongoClient.connect(uri, {
server: {
socketOptions: {
connectTimeoutMS: 3000
}
},
}, function (err, db) {
if (err) {
console.log('error: ', err);
} else {
var col = db.collection('test');
col.insert({abc:1}, function (err, result) {
if (err) {
console.log('insert error: ', err);
} else {
console.log('success: ', result);
}
db.close()
})
}
})
}
जेनेरिक-पूल समाधान:
var MongoClient = require('mongodb').MongoClient;
var poolModule = require('generic-pool');
var uri = "mongodb://localhost/test";
var read_pool = poolModule.Pool({
name : 'redis_offer_payment_reader',
create : function(callback) {
MongoClient.connect(uri, {}, function (err, db) {
if (err) {
callback(err);
} else {
callback(null, db);
}
});
},
destroy : function(client) { client.close(); },
max : 400,
// optional. if you set this, make sure to drain() (see step 3)
min : 200,
// specifies how long a resource can stay idle in pool before being removed
idleTimeoutMillis : 30000,
// if true, logs via console.log - can also be a function
log : false
});
var size = [];
for (var i = 0; i < 100000; i++) {
size.push(i);
}
size.forEach(function() {
read_pool.acquire(function (err, db) {
if (err) {
console.log('error: ', err);
} else {
var col = db.collection('test');
col.insert({abc:1}, function (err, result) {
if (err) {
console.log('insert error: ', err);
} else {
//console.log('success: ', result);
}
read_pool.release(db);
})
}
})
})
हालांकि Node.js एक भी प्रक्रिया और घटना मॉडल, का उपयोग करता है लेकिन आईओ कार्यों हमेशा async होना चाहिए। जो मुझे लगता है कि मेरे मुद्दों का कारण नहीं हो सकता है। लेकिन, मैं उद्धृत तरीके से कोशिश करूंगा, धन्यवाद। – Jack
आप अपने पहले उदाहरण में बिंदु खो रहे हैं; वह कोड आपके मोंगो ऐप को 1000 बार शुरू करने के बराबर है। आपको केवल अपने ऐप में एक बार कनेक्ट होना चाहिए। –
हां, यह समस्या है, और कारण मोंगो क्लाइंट एक कनेक्शन पूल है जो अन्य डीबीएस की तुलना में अधिक महंगा हो जाता है। लेकिन नोड.जेएस एकल प्रक्रिया मॉडल के साथ समस्या नहीं है। – Jack