2009-10-12 37 views
12

एएसपी.NET सिस्टम में महंगी खोज के परिणामों को कैशिंग करने के लिए एक अच्छा डिज़ाइन क्या है?एएसपी.NET अनुप्रयोग में खोज परिणामों के लिए कैशिंग आर्किटेक्चर

किसी भी विचार का स्वागत किया जाएगा ... विशेष रूप से उन लोगों को जिन्हें हमारे स्वयं के जटिल आधारभूत संरचना का आविष्कार करने की आवश्यकता नहीं है। कई सौ परिणाम रिकॉर्ड

  • प्रत्येक खोज अपेक्षाकृत महंगा है और निष्पादित करने के लिए timeconsuming है

    • प्रत्येक खोज परिणाम शून्य से शामिल उत्पादन कर सकते हैं (5-15 सेकंड:

      यहां कुछ सामान्य समस्या से संबंधित आवश्यकताएँ हैं डेटाबेस में)

    • परिणाम ग्राहक पर प्रदर्शित किया जा रहा उपयोगकर्ता के लिए जानकारी अधिभार से बचने के लिए पहले पृष्ठवार किया जाना चाहिए
    • उपयोगकर्ता को सॉर्ट, फ़िल्टर और परिणामों के भीतर खोज करने के लिए सक्षम होने की अपेक्षा लौटे
    • उपयोगकर्ता परिणाम
    • उपयोगकर्ता पृष्ठों के किसी भी संख्या पर (चेक बॉक्स के माध्यम से) से अधिक आइटम का चयन करने के
    • उपयोगकर्ता अपेक्षाकृत तेज़ प्रदर्शन एक बार एक खोज है उम्मीद सक्षम होने की अपेक्षा जल्दी से खोज में पृष्ठों के बीच स्विच करने में सक्षम होने की उम्मीद समाप्त हो गया

    मैं कहाँ और कैसे कैशिंग को लागू करने के लिए कुछ संभव विकल्पों को देखने के:

    1. सर्वर (सत्र या अनुप्रयोग कैश में) पर कैश, postbacks या अजाक्स पैनलों का उपयोग कुशल पृष्ठांकन की सुविधा के लिए, छंटाई , फिल्टर एनजी, और खोज।

    • पेशेवरों: ASP.NET बुनियादी ढांचे
    • कान्स से लागू करने के लिए आसान, सभ्य समर्थन: बहुत बातूनी, स्मृति सर्वर पर गहन, डेटा आवश्यक से अधिक समय कैश की जा सकती; सर्वर पर प्रतिबंध लगाता है लोड संतुलन प्रथाओं

    2. कैश (ऊपर के रूप में), लेकिन serializeable संरचनाओं कि समय की कुछ अवधि के बाद स्मृति से बाहर ले जाया जाता है सर्वर पर स्मृति दबाव को कम करने के लिए प्रयोग कर

    • प्रोएस: सर्वर मेमोरी का कुशल उपयोग; लोड संतुलन का उपयोग करके स्केल करने की क्षमता;
    • CONS: .NET आधारभूत संरचना से सीमित समर्थन; डेटा संरचनाओं में परिवर्तन होने पर संभावित रूप से नाजुक; डेटाबेस पर अतिरिक्त भार रखता है; काफी अधिक जटिल

    3. ग्राहक पर कैश (JSON या XML क्रमांकन का उपयोग), पृष्ठ पर अंक लगाना करने के लिए, प्रकार, फिल्टर क्लाइंट साइड जावास्क्रिप्ट का उपयोग, और परिणाम का चयन करें।

    • पेशेवरों: उपयोगकर्ता अनुभव संपर्क कर सकते हैं "अमीर ग्राहक" का स्तर; अधिकांश ब्राउज़र जेएसओएन/एक्सएमएल को मूल रूप से संभाल सकते हैं - मैनिपुलेशन के लिए सभ्य पुस्तकालय मौजूद हैं (उदा। jQuery)
    • CONS: प्रारंभिक अनुरोध को डाउनलोड करने में लंबा समय लग सकता है; क्लाइंट मशीनों पर महत्वपूर्ण स्मृति पदचिह्न; ग्राहक डेटा की एक संकुचित/इनकोडिंग प्रतिनिधित्व के प्रयोग पर

    4. कैश को लागू करने के कुछ स्तर पर हाथ से तैयार किए जावास्क्रिप्ट की आवश्यकता होगी - जब पृष्ठों स्विचन, क्रमित, फ़िल्टर और खोज को डिकोड करने के सर्वर में वापस बुलाने ।

    • पेशेवरों: सर्वर पर छोटा स्मृति प्रभाव; जब तक ग्राहक को इसकी आवश्यकता होती है तब तक राज्य को रहने की अनुमति मिलती है; JSON/XML
    • CONS पर क्लाइंट पर थोड़ा बेहतर मेमोरी उपयोग क्लाइंट/सर्वर के बीच आगे बढ़ने वाला बड़ा डेटा सेट; जेएसओएन/एक्सएमएल का उपयोग कर शुद्ध क्लाइंट-साइड कैशिंग के मुकाबले धीमी कार्यक्षमता (नेटवर्क I/O के कारण); और अधिक लागू करने के लिए जटिल - नेट/ब्राउज़र

    5. कुछ वैकल्पिक कैशिंग योजना मैं नहीं माना जाता है से सीमित समर्थन ...

  • +1

    एक सुझाव: अपने मूल शीर्षक "खोज परिणामों के लिए कैशिंग" पर कुछ गुगल करें। अपने परिदृश्य में कैशिंग में केवल देख रहे हैं अपने आप को रोलिंग। वहाँ किया गया था कि; और यह खोज के साथ मुश्किल है। मैं तो बस कह रहा हूं। – jro

    +1

    डीबी प्रश्नों के संदर्भ में 5-15 सेकंड लंबा लंबा समय है। शायद आपको डीबी प्रश्नों में सुधार करने के लिए कम से कम कुछ प्रयास करना चाहिए ("बाहरी जुड़ने" के बजाय "आंतरिक जुड़ने" का उपयोग करें, "जहां" फ़िल्टर के बजाय "आंतरिक जुड़ें" का उपयोग करें)। पूर्ण पाठ अनुक्रमण का उपयोग करने पर भी विचार करें। –

    उत्तर

    12

    # 1 के लिए, आप एक राज्य सर्वर का उपयोग माना जाता है (यहां तक ​​कि एसक्यूएल सर्वर) या एक साझा कैश तंत्र? plentygoodones से choose से Velocity बहुत परिपक्व हो रहा है - शायद जल्द ही आरटीएम होगा। एक कैश अमान्यता योजना जो इस पर आधारित है कि उपयोगकर्ता नई खोज बनाता है, खोज पेजिनेशन के अलावा किसी भी अन्य पेज को हिट करता है, और अंततः एक मानक टाइमआउट (20 मिनट) आपके कैश को कम से कम आकार में कम करने में बहुत सफल होना चाहिए।

    संदर्भ:

    +0

    साझा कैश ने हमारे लिए अच्छा काम किया है, और प्रदर्शन के अनुसार वेग कम हो रहा है। आप अपनी सूची में मेमकैड भी जोड़ना चाह सकते हैं, लेकिन आपको .NET के माध्यम से इसे एक्सेस करने के लिए अपनी लाइब्रेरी लिखनी होगी – BozoJoe

    1

    के बाद से आप कहते हैं कि किसी भी विचारों का स्वागत है:

    हम एक LINQ परिणाम से कैशिंग परिणाम सेट के लिए काफी सफलतापूर्वक उद्यम पुस्तकालय कैशिंग उपयोग किया गया है।

    http://msdn.microsoft.com/en-us/library/cc467894.aspx

    यह कस्टम कैश समाप्ति का समर्थन करता है, तो (कस्टम कोड का एक छोटा सा के साथ) को अपनी आवश्यकताओं के सबसे का समर्थन करना चाहिए वहाँ। यदि खोज की गोपनीयता महत्वपूर्ण है तो इसमें एन्क्रिप्टेड बैकिंग स्टोर्स समेत कुछ बैकिंग स्टोर्स भी हैं।

    यह बहुत अच्छी तरह से विशेष रुप से प्रदर्शित है।

    मेरे सिफारिश है # 1 और # 3 का एक संयोजन:

    1. कैश सर्वर पर क्वेरी परिणाम।
    2. परिणाम पूर्ण पृष्ठ और JSON व्यू दोनों के रूप में उपलब्ध कराएं।
    3. कैश प्रत्येक पृष्ठ को क्लाइंट पर गतिशील रूप से पुनर्प्राप्त किया जाता है, लेकिन पेज बदलते समय प्रत्येक बार एक अनुरोध भेजें।
    4. क्लाइंट कैश अमान्यता करने के लिए ETAG का उपयोग करें।
    0

    SharedCache पर एक नज़र डालें - यह 1/2 बहुत आसान बनाता है और लोड संतुलित प्रणाली में ठीक काम करता है। नि: शुल्क, मुक्त स्रोत, और हम इसे किसी भी मुद्दे के साथ लगभग एक वर्ष तक उपयोग कर रहे हैं।

    3

    "वैकल्पिक" कैशिंग योजना के तहत एक विचार उठा रहा है। यह किसी दिए गए कैश आर्किटेक्चर के साथ आपके प्रश्न का उत्तर नहीं देता है, बल्कि आपके खोज एप्लिकेशन की आपकी मूल आवश्यकताओं पर वापस जाता है।

    भले ही आप अपना कैश लागू करते हैं, यह प्रभावशीलता इष्टतम से कम हो सकती है - खासकर जब आपकी खोज अनुक्रमणिका आकार में बढ़ती है। आपकी अनुक्रमणिका बढ़ने के साथ ही कैश हिट दरें घट जाएंगी। एक निश्चित इन्फ्लिक्शन बिंदु पर, खोज और कैशिंग दोनों के लिए समर्पित संसाधनों के कारण आपकी खोज वास्तव में धीमी हो सकती है।

    अधिकतर खोज उप-सिस्टम ऑपरेशन में दक्षता के साधन के रूप में अपनी आंतरिक कैशिंग आर्किटेक्चर को कार्यान्वित करते हैं। Solr, Lucene पर निर्मित एक ओपन-सोर्स सर्च सिस्टम, तेजी से ऑपरेशन प्रदान करने के लिए अपने आंतरिक कैश को बनाए रखता है। ऐसे अन्य खोज सिस्टम हैं जो आपके लिए काम करेंगे, और वे परिणाम कैशिंग के लिए समान रणनीतियां लेते हैं।

    मैं आपको एक अलग खोज आर्किटेक्चर पर विचार करने की सलाह दूंगा यदि आपकी खोज अनुक्रमणिका इसे वारंट करती है, क्योंकि एक फ्री-टेक्स्ट कीवर्ड खोज आधार में कैशिंग प्रभावी ढंग से कार्यान्वित करने के लिए एक जटिल संचालन है।

    5

    यदि आप मार्च 2010 तक प्रतीक्षा करने में सक्षम हैं, तो .NET 4.0 एक नए System.Caching.CacheProvider के साथ आता है, जो कई कार्यान्वयन (डिस्क, मेमोरी, एसक्यूएल सर्वर/वेग के रूप में वर्णित) का वादा करता है।

    तकनीक here का एक अच्छा स्लाइड शो है। हालांकि यह थोड़ा सा "अपना खुद का रोल" है या इसमें बहुत कुछ है। लेकिन फ्रेमवर्क जारी होने पर प्रदाता मॉडल के लिए शायद बहुत सारे बंद और खुले स्रोत प्रदाता लिखे जा रहे हैं।

    छह अंक आप राज्य के लिए, कुछ सवाल अप फसलों

    • क्या खोज परिणामों में निहित है? प्रत्येक परिणाम से जुड़े डेटा या मेटाडेटा के बस स्ट्रिंग?
    • आप जिस सेट को खोज रहे हैं वह कितना बड़ा है?

    रैम में पूरे सेट को संग्रहीत करने में आप कितनी मेमोरी का उपयोग करेंगे? या कम से कम 10 से 100 खोज शब्दों में से एक कैश है। पहली खोज के बाद स्मार्ट और कैशिंग संबंधित खोज भी एक और विचार हो सकती है।

    परिणाम के लिए 5-15 सेकंड खोज के लिए प्रतीक्षा करने में काफी समय लगता है, इसलिए मुझे लगता है कि यह एक expedia.com खोज जैसा है जहां कई स्रोतों की पूछताछ की जा रही है और बहुत सारी जानकारी लौटा दी गई है।

    मेरे सीमित अनुभव से, क्लाइंट-साइड केवल कैशिंग दृष्टिकोण के साथ सबसे बड़ी समस्या Internet Explorer 6 or 7 है। सर्वर केवल और एचटीएमएल पेजिंग के लिए कैश में सेट किए गए पूरे परिणाम के साथ मेरी वरीयता है, कुछ समझदार समय अवधि के बाद इसे समाप्त कर रहा है। लेकिन हो सकता है कि आपने पहले ही यह कोशिश की हो और सर्वर की स्मृति खाया जा सके।

    0

    अपने विकल्पों पर विचार करते समय, इस बात पर विचार करें कि कोई भी उपयोगकर्ता डेटा के माध्यम से पृष्ठ बनाना चाहता है। हम उन पर एचटीएमएल में ब्राउज़रों के शीर्ष पर अनुप्रयोग बनाने की कोशिश करने के आर्टिफैक्ट के रूप में बल देते हैं, जो स्वाभाविक रूप से अच्छी तरह से स्केल नहीं करते हैं। हमने इस पर शीर्ष पर नकली आवेदन राज्य के सभी प्रकार की हैकरी का आविष्कार किया है, लेकिन यह अनिवार्य रूप से एक टूटा हुआ मॉडल है।

    तो, कृपया इसे सिल्वरलाइट या फ्लैश में वास्तविक समृद्ध ग्राहक के रूप में लागू करने पर विचार करें। आप उस उपयोगकर्ता अनुभव को हरा नहीं देंगे, और एक नियमित वेब पेज में व्यावहारिक से डेटा को कैश करना बहुत आसान है। अपेक्षित उपयोगकर्ता व्यवहार के आधार पर, आपकी समग्र बैंडविड्थ को अनुकूलित किया जा सकता है क्योंकि सर्वर के दौर की यात्रा किसी भी एएसपी.नेट ओवरहेड के बजाय केवल एक तंग डेटा सेट प्राप्त करेगी।

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