मैं गिटहब पर सी # ड्राइवर का उपयोग कर हाल ही में मोंगोडीबी के साथ खेल रहा हूं (यह अजीब तेजी से है)। सब कुछ मेरे छोटे सिंगल थ्रेडेड कंसोल ऐप में ठीक काम कर रहा है जिसका मैं परीक्षण कर रहा हूं। मैं सिंगल थ्रेडेड चलने वाले 8 सेकंड के तहत 1,000,000 दस्तावेज़ (हाँ, मिलियन) जोड़ सकता हूं। अगर मैं लूप के दायरे के बाहर कनेक्शन का उपयोग करता हूं तो मुझे केवल यह प्रदर्शन मिलता है। दूसरे शब्दों में, मैं प्रत्येक डालने के लिए कनेक्ट करने के बजाय कनेक्शन को प्रत्येक सम्मिलन के लिए खोल रहा हूं। जाहिर है कि यह बढ़ गया है।मोंगोडीबी कनेक्शन के लिए .NET सर्वोत्तम प्रथाओं?
मैंने सोचा कि मैं यह देखने के लिए एक पायदान को क्रैंक कर दूंगा कि यह एकाधिक धागे के साथ कैसे काम करता है। मैं ऐसा इसलिए कर रहा हूं क्योंकि मुझे एकाधिक समवर्ती अनुरोधों वाली वेबसाइट अनुकरण करने की आवश्यकता है। मैं 15 से 50 धागे के बीच कताई कर रहा हूं, फिर भी सभी मामलों में कुल 150,000 दस्तावेज डालने वाला हूं। अगर मैं थ्रेड चलाता हूं, प्रत्येक प्रत्येक सम्मिलन ऑपरेशन के लिए एक नया कनेक्शन बनाता है, तो प्रदर्शन एक रुकावट के लिए पीसता है।
स्पष्ट रूप से मुझे कनेक्शन साझा करने, लॉक करने या पूल करने का कोई तरीका ढूंढना होगा। इसमें सवाल है। MongoDB से जोड़ने के मामले में सबसे अच्छा अभ्यास क्या है? क्या कनेक्शन को ऐप के जीवन के लिए खुला रखा जाना चाहिए (प्रत्येक ऑपरेशन के लिए टीसीपी कनेक्शन खोलने और बंद करने के लिए पर्याप्त विलंबता है)?
क्या किसी के पास मोंगोडीबी के साथ कोई वास्तविक दुनिया या उत्पादन अनुभव है, और विशेष रूप से अंतर्निहित कनेक्शन?
यहां एक स्थिर कनेक्शन का उपयोग करके मेरा थ्रेडिंग नमूना है जो सम्मिलित संचालन के लिए बंद है। कृपया उन सुझावों की पेशकश करें जो वेब संदर्भ में प्रदर्शन और विश्वसनीयता को अधिकतम कर देंगे!
private static Mongo _mongo;
private static void RunMongoThreaded()
{
_mongo = new Mongo();
_mongo.Connect();
var threadFinishEvents = new List<EventWaitHandle>();
for(var i = 0; i < 50; i++)
{
var threadFinish = new EventWaitHandle(false, EventResetMode.ManualReset);
threadFinishEvents.Add(threadFinish);
var thread = new Thread(delegate()
{
RunMongoThread();
threadFinish.Set();
});
thread.Start();
}
WaitHandle.WaitAll(threadFinishEvents.ToArray());
_mongo.Disconnect();
}
private static void RunMongoThread()
{
for (var i = 0; i < 3000; i++)
{
var db = _mongo.getDB("Sample");
var collection = db.GetCollection("Users");
var user = GetUser(i);
var document = new Document();
document["FirstName"] = user.FirstName;
document["LastName"] = user.LastName;
lock (_mongo) // Lock the connection - not ideal for threading, but safe and seemingly fast
{
collection.Insert(document);
}
}
}
अंत में आपने क्या निर्णय लिया? एक ही समस्या का सामना करना ... –
अच्छी खबर यह है कि मुझे फैसला नहीं करना पड़ा। Mongodb-csharp और NoRM ड्राइवर दोनों कनेक्शन पूलिंग के लिए समर्थन जोड़ा। दोनों पुस्तकालयों ने अच्छी तरह से डिजाइन किया है, एक मोंगोड या मोंगो प्रक्रिया के खिलाफ कनेक्शन पूलिंग के लिए थ्रेड सुरक्षित तंत्र। दोनों क्षेत्र निकट भविष्य में प्रतिकृति सेट समर्थन भी जोड़ रहे हैं। –
@ टाइलरब्रिंक क्या आप 8sec के तहत 1 एम दस्तावेज़ों को सम्मिलित करने में सक्षम हैं इसका एक उदाहरण दिखा सकते हैं? मैं एकल थ्रेड पर उस गति तक पहुंचने में असमर्थ हूं। – IamStalker