हम कॉर्पोरेट वेब एप्लिकेशन के लिए खोज आर्किटेक्चर तैयार कर रहे हैं। हम इसके लिए Lucene.net का उपयोग करेंगे। इंडेक्स बड़े नहीं होंगे (लगभग 100,000 दस्तावेज), लेकिन खोज सेवा हमेशा ऊपर रहनी चाहिए और हमेशा अद्यतित रहनी चाहिए। इंडेक्स में हर समय और समवर्ती खोजों में नए दस्तावेज़ जोड़े जाएंगे। चूंकि हमारे पास खोज प्रणाली के लिए उच्च उपलब्धता होनी चाहिए, हमारे पास 2 एप्लिकेशन सर्वर हैं जो खोज और अनुक्रमण करने के लिए डब्ल्यूसीएफ सेवा का पर्दाफाश करते हैं (सेवा की एक प्रति प्रत्येक सर्वर में चल रही है)। सर्वर इंडेक्स तक पहुंचने के लिए lucene.net एपीआई का उपयोग करता है।एकाधिक ऐप सर्वरों पर Lucene.net अनुक्रमणिका को सिंक करना
समस्या यह है कि इंडेक्स को हर समय समन्वयित करने का सबसे अच्छा समाधान क्या होगा? हम कई विकल्पों पर विचार किया है:
अनुक्रमण के लिए एक सर्वर और 2 सर्वर का उपयोग एसएमबी के माध्यम से अनुक्रमित होने का उपयोग करना: कोई क्योंकि हम विफलता स्थिति का एक बिंदु है कर सकते हैं;
दोनों सर्वरों को इंडेक्स करना, अनिवार्य रूप से प्रत्येक इंडेक्स को दो बार लिखना: शायद लुभावनी प्रदर्शन, और उदाहरण के लिए desync की संभावना। सर्वर 1 अनुक्रमणिका ठीक है और सर्वर 2 डिस्क स्थान से बाहर चला जाता है या जो भी हो;
इंडेक्स तक पहुंच को लपेटने के लिए एसओएलआर या केएटीटीए का उपयोग करना: नहीं, हमारे पास सर्वर पर टोमकैट या समान चलाना नहीं है, हमारे पास केवल आईआईएस है।
डेटाबेस में अनुक्रमणिका को संग्रहीत करना: मुझे लगता है कि यह लुसीन (जेडीबीसी डायरेक्टरी मॉड्यूल) के जावा संस्करण के साथ किया जा सकता है, लेकिन मुझे Lucene.net के लिए कुछ भी नहीं मिला। यहां तक कि यदि इसका मतलब एक छोटा प्रदर्शन हिट था, तो हम इस विकल्प के लिए जाएंगे क्योंकि यह न्यूनतम रूप से मिनिनम विकास के साथ समेकन और समन्वयन समस्या को हल करेगा।
Lucene.net वितरित खोज contrib मॉड्यूल का उपयोग: मैं इस बारे में दस्तावेज़ीकरण के साथ एक लिंक दर्ज नहीं कर सका। मैं कोड को देखकर यह भी नहीं जानता कि यह कोड क्या करता है, लेकिन ऐसा लगता है कि यह वास्तव में कई मशीनों में इंडेक्स को विभाजित करता है, जो हम नहीं चाहते हैं।
rsync और दोस्तों, 2 सर्वरों के बीच सूचकांक की प्रतिलिपि बनाते हैं: यह हमें हैकिश और त्रुटि-प्रवण लगता है, और यदि सूचकांक बड़े हो जाते हैं, तो कुछ समय लग सकता है, और इस अवधि के दौरान हम होंगे ग्राहकों को भ्रष्ट या असंगत डेटा लौटाना, इसलिए हमें कुछ विज्ञापन लॉकिंग नीति विकसित करना होगा, जिसे हम नहीं चाहते हैं।
मुझे समझ में आता है कि यह एक जटिल समस्या है, लेकिन मुझे यकीन है कि बहुत से लोगों ने इसका सामना किया है। किसी भी मदद का स्वागत है!
शॉन, यह वर्तमान में हमारे उम्मीदवार विकल्प है। मैं आपसे और इसकेडोक से सहमत हूं कि यह सबसे अच्छा विकल्प लगता है। मैं जेडीबीसी डायरेक्टरी के स्रोतों को खोजने का प्रयास कर रहा हूं यह देखने के लिए कि क्या .NET + SQL सर्वर पर एक पोर्ट संभव होगा। यह देखने के लिए कि क्या नए दृष्टिकोण आते हैं, प्रश्न थोड़ी देर तक खुला रहेगा, अन्यथा यह जवाब स्वीकार करेगा। –
मैंने एक ही चीज़ को एक बार चेक किया। यह प्रयास के लायक नहीं था क्योंकि डीबी लेनदेन से संबंधित सामानों का एक समूह है जो पोर्ट को छोटा नहीं है। नेट। जेडीबीसी डायरेक्टरी सामग्री का उपयोग करके कम गति की शिकायतें भी थीं। स्रोत कम्पास प्रोजेक्ट में है - http://svn.compass-project.org/svn/compass/trunk/src/main/src/org/apache/lucene/store/jdbc/ –
कुछ सोचने के बाद, यह वही है मैं सबसे व्यवहार्य समाधान के रूप में देखता हूं: जब एक अनुक्रमण/डिंडेक्सिंग अनुरोध प्राप्त होता है, तो एक साझा डीबी तालिका में एक पंक्ति डालें जो कतार के रूप में काम करती है। एक साधारण Win32 सेवा को कार्यान्वित करें जो दोनों ऐप सर्वरों में चलता है और स्थानीय रूप से सामग्री को अनुक्रमणित करते हुए प्रत्येक एक्स सेकंड में कतार का चुनाव करता है। जब सामग्री सफलतापूर्वक अनुक्रमित की जाती है, तो सेवा आइटम को संसाधित के रूप में चिह्नित करती है, अन्यथा यह कोशिश करता रहता है। –