2013-02-11 25 views
8

पर्यावरण:क्या एएसपी.NET जावास्क्रिप्ट के माध्यम से उपयोगकर्ता को नेविगेट करने के बाद भी एक अनुरोध को विश्वसनीय रूप से संसाधित करता है?

  • विंडोज सर्वर 2003 - आईआईएस 6.x
  • ASP.NET 3.5 (सी #)
  • आईई 7,8,9
  • एफएफ (जो नवीनतम 10 संस्करण हैं)

उपयोगकर्ता परिदृश्य:

उपयोगकर्ता बड़े डेटा-सेट के खिलाफ खोज मानदंड दर्ज करता है। अनुरोध शुरू करने के बाद, उन्हें परिणाम पृष्ठ पर नेविगेट किया जाता है, जहां वे डेटा लोड होने तक प्रतीक्षा करते हैं और फिर डेटा को परिशोधित कर सकते हैं।

तकनीकी परिदृश्य:

उपयोगकर्ता (ajax कॉल के माध्यम से) खोज मापदंड भेजता है के बाद, यूआई बैक-एंड सेवा कहते हैं। बैक-एंड सेवा प्रश्न लेनदेन प्रणाली (ओं) और परिणामी डेटा को एक डीबी "कैश" में डालता है - एक denormalized तालिका, डेटा के आगे परिष्कृत करने के लिए सेट अप (यानी सॉर्टिंग, फ़िल्टरिंग)। यूआई तब तक प्रतीक्षा करता है जब तक डेटा कैश नहीं किया जाता है और फिर यह सूचित करने पर कि प्रक्रिया पूरी हो जाती है, परिणामस्वरूप पृष्ठ पर नेविगेट करता है। परिणामस्वरूप पृष्ठ तब denormalized तालिका से डेटा प्राप्त करने के लिए एक कॉल करता है।

समस्या:

खोज अपेक्षाकृत बड़े प्रश्नों है कि कई मापदंड में प्रवेश पर आधारित सिस्टम क्वेरी करने के लिए होने अंत के लिए धीमी गति से (15-25 सेकंड) है। यह अन्य प्रश्नों के लिए अपेक्षाकृत तेज़ है (< 4 सेकंड)।

तकनीकी प्रतिबंध:

  1. हम नहीं पूरी तरह से फिर से वास्तुकार यह खोज/परिणाम प्रणाली कर सकते हैं। UI और बैक-एंड एक साथ कैसे बंधे हैं, इसके बीच यहां कई जटिलताओं का तरीका है। खोज मानदंडों को पूरा करने के बाद पृष्ठ की आवश्यकता है (बाधाओं के कारण जिन्हें स्टैक ओवरव्लो पर हल नहीं किया जा सकता है)।

  2. हम संगठन से पूछने से पहले डेटा को denormalize करने के लिए भी नहीं कह सकते हैं क्योंकि डेटा वास्तविक समय होना चाहिए, यानी यदि कोई उपयोगकर्ता अन्य सिस्टम में बदलाव करता है, तो डेटा को सही तरीके से दिखाना होगा बाद में एक खोज

प्रक्रिया है कि मैं पालन करना चाहते हैं:

  1. मैं एक छोटे से धोखा देने के लिए चाहते हैं। मैं एक अग्नि-भूल मॉडल में एक async HttpHandler के माध्यम से "कैश" अनुरोध जारी करना चाहता हूं।

  2. क्वेरी जारी करने के बाद, मैं पृष्ठ को परिणामी पृष्ठ पर बदलना चाहता हूं।

  3. संक्रमण पृष्ठ पर, मैं यह देखने के लिए "कैश" तालिका को मतदान करना चाहता हूं कि डेटा अभी तक इसमें डाला गया है या नहीं।

  4. कारण मैं तुरंत इस संक्रमण को करना चाहता हूं, यह है कि परिणामी पृष्ठ अपने आप पर महंगा है (डेटा प्राप्त किए बिना भी) - डेटा प्राप्त करने वाली सेवा को कॉल करने से पहले भी 2 सेकंड लोड समय कैश से।

प्रश्न:

विल ASP.NET धागा async हैंडलर के माध्यम से कहा जाता है कि भले ही मैं पृष्ठ से दूर नेविगेट Javascript रीडायरेक्ट का उपयोग कर मज़बूती से प्रसंस्करण जारी रखें?

तकनीकी सीमाओं 2:

हाँ, मुझे पता है ... यह खोज प्रक्रिया कुशल ध्वनि नहीं करता है। अभी इसके बारे में कुछ भी नहीं है जो मैं कर सकता हूं। मैं कुछ भी करने की कोशिश कर रहा हूं जो इसे थोड़ा बेहतर करने के लिए कर सकता है, जबकि हम शोध जारी रखते हैं कि हम इसे फिर से आर्किटेक्ट करने के लिए कैसे जा रहे हैं।

यदि आपका उत्तर है: "इसे फेंक दें और शुरू करें", कृपया उत्तर न दें। यह स्वीकार्य नहीं है।

+0

ठीक है, मुझे देखने दो कि मुझे यह मिला है या नहीं। जब उपयोगकर्ता कुछ खोज मानदंड भेजते हैं, तो आप क्वेरी निष्पादन को असीमित रूप से प्रारंभ करेंगे और तुरंत उपयोगकर्ता को परिणाम पृष्ठ पर रीडायरेक्ट करेंगे। फिर, परिणाम पृष्ठ पर आप पृष्ठ लोड करेंगे और उपयोगकर्ता के परिणामों को दिखाने के लिए सर्वर पर क्वेरी खत्म होने पर सत्यापित करना जारी रखें। और आप पूछ रहे हैं कि उपयोगकर्ता परिणाम पृष्ठ से बाहर निकलने पर एसिंक क्वेरी निष्पादन जारी रहेगा या नहीं? क्या वो सही है? –

+0

यह लगभग सही है। सवाल यह नहीं है कि उपयोगकर्ता परिणाम पृष्ठ छोड़ देता है, लेकिन यह परिणाम जारी रहेगा क्योंकि उपयोगकर्ता परिणाम पृष्ठ पर स्थानांतरित हो जाता है। मेरी स्थानीय मशीन पर मेरे परीक्षण में, एसिंक ऑपरेशन चलना जारी रहता है। हालांकि, मैं यह सत्यापित करना चाहता हूं कि प्रक्रिया कितनी विश्वसनीय है। क्या यह एएसपी.नेट का डिज़ाइन किया गया व्यवहार है या "यह मेरी मशीन पर काम करता है" का मामला है? –

+0

यदि आप वेब सर्वर पर असीमित रूप से कुछ प्रोसेसिंग चलाने के लिए थ्रेडिंग नेमस्पेस (क्या आप हैं?) का उपयोग कर रहे हैं, तो मुझे नहीं लगता कि यह "यह मेरी मशीन पर काम करता है" केस होगा। यह निश्चित रूप से आईआईएस पर भी अपेक्षित के रूप में काम करना चाहिए। –

उत्तर

4

हां।

संपत्ति Response.IsClientConnected है जिसका उपयोग यह जानने के लिए किया जाता है कि एक लंबी चल रही प्रक्रिया अभी भी जुड़ी हुई है या नहीं। इस प्रॉपर्टी का कारण यह है कि क्लाइंट डिस्कनेक्ट हो जाने पर भी प्रक्रिया चलती रहेगी और संपत्ति के माध्यम से मैन्युअल रूप से पता लगाया जाना चाहिए और यदि प्रीमेचर डिस्कनेक्ट होता है तो मैन्युअल रूप से बंद हो जाता है। क्लाइंट डिस्कनेक्ट पर चल रही प्रक्रिया को बंद करने के लिए डिफ़ॉल्ट रूप से यह डिफ़ॉल्ट नहीं है।

इस संपत्ति के लिए संदर्भ: http://msdn.microsoft.com/en-us/library/system.web.httpresponse.isclientconnected.aspx

अद्यतन

FYI करें यह एक बहुत ही बुरा संपत्ति सॉकेट के साथ इन दिनों पर भरोसा करने की है।मैं दृढ़ता से आपको एक ऐसा दृष्टिकोण करने के लिए प्रोत्साहित करता हूं जो आपको कुछ डेटाबेस में नोट्स को पूरा करने की अनुमति देता है या पूरा करने के लिए कुछ लंबे समय तक चलने वाले कार्य की कतार, शायद खरगोश एमक्यू या ऐसा कुछ उपयोग करें, जो बदले में सॉकेट.ओ या अद्यतन के समान होता है वेब पेज या ऐप एक बार पूरा हो गया।

+0

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

+0

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

3

एएसपी.NET थ्रेड पर एसिंक ऑपरेशन कैसे नहीं करते हैं? एएसपी.NET कोड डेटा खोज को कतार करने के लिए एक सेवा को कॉल करने दें, फिर सेवा से टोकन के साथ ब्राउज़र पर वापस आएं, फिर यह परिणाम पृष्ठ पर रीडायरेक्ट करेगा जो पूर्ण परिणाम का इंतजार कर रहा है? परिणाम पृष्ठ सेवा से टोकन का उपयोग करके मतदान करेगा।

इस तरह, आपको इस बारे में चिंता करने की ज़रूरत नहीं होगी कि एएसपी.नेट किसी भी तरह से सीख लेगा कि ब्राउज़र एक अलग पृष्ठ पर स्थानांतरित हो गया है या नहीं।

+0

एक और स्रोत मुझे इस प्रकार के समाधान के बारे में बता रहा था। अनिवार्य रूप से, हमें कुछ प्रकार की पृष्ठभूमि सेवा (सबसे अधिक संभावना एएसपी.नेट के बाहर) होगी जो अतिरिक्त टोकन के लिए निगरानी रखेगी, खोज निष्पादित करेगी और फिर खोज किए जाने वाले टोकन को अपडेट करें? यह एक छोटी सी चेतावनी को छोड़कर महान लगता है। हम "तेज़" खोजों को धीमा नहीं करना चाहते हैं (यदि संभव हो)। लेकिन, यह एक ऐसा एवेन्यू हो सकता है जिसे हमें जाना है, अगर हम अपने प्रदर्शन में अधिक वास्तुकला परिवर्तनों के बिना अधिक स्थिरता बनाना चाहते हैं। मैं अब भी एएसपी.NET व्यवहार के आंतरिक के बारे में उत्सुक हूं। –

+0

सेवा को "मॉनिटर" नहीं करना पड़ेगा। यह एक डब्ल्यूसीएफ सेवा होगा जो खोज मानदंड वाले अनुरोध के लिए प्रतीक्षा कर रही है। यह मानदंडों को जारी रखेगा, अनुरोध का प्रतिनिधित्व करने वाले टोकन को वापस करेगा, फिर खोज को संसाधित करना शुरू कर देगा। यह खोज की प्रगति का ट्रैक रखेगा। प्रगति के लिए बाद में पूछे जाने पर, यह प्रगति पर रिपोर्ट करेगा। पूरा होने पर, यह खोज के परिणाम वापस कर देगा। –

+0

इसके अलावा, यदि आप समय से पहले निर्धारित कर सकते हैं कि "तेज़" खोज तेज होगी, तो आप उस खोज को "इन-लाइन" कर सकते हैं। वास्तव में, आप ASP.NET पृष्ठ को एक या दूसरी प्रतीक्षा कर सकते हैं, फिर सेवा से पूछें कि यह हो गया है या नहीं। यदि नहीं, _then_ "परिणामों के लिए प्रतीक्षा" पृष्ठ पर रीडायरेक्ट करें। –

0

थ्रेडिंग (System.Threading) का उपयोग करने का एक और विकल्प है।
जब उपयोगकर्ता खोज मानदंड भेजता है, तो सर्वर पृष्ठ अनुरोध को संसाधित करना शुरू करता है, खोज निष्पादित करने के लिए जिम्मेदार एक नया थ्रेड बनाता है, और ब्राउज़र पर वापस आने वाली प्रतिक्रिया को समाप्त करता है और परिणाम पृष्ठ पर रीडायरेक्ट करता है जबकि थ्रेड चालू रहता है सर्वर पृष्ठभूमि।
परिणाम पृष्ठ सर्वर पर सत्यापन जारी रखेगा यदि क्वेरी निष्पादन समाप्त हो गया था क्योंकि प्रारंभिक थ्रेड प्रगति जानकारी साझा करेगा। जब यह खत्म हो जाता है, तो परिणाम पृष्ठ द्वारा अगली AJAX कॉल करने पर परिणाम लौटा दिए जाते हैं।

इसे वेबसाकेट्स का उपयोग करने पर भी विचार किया जा सकता है। एक अर्थ में कि वेबसर्वर स्वयं ब्राउज़र निष्पादन को संसाधित करते समय बता सकता है क्योंकि यह पूर्ण-डुप्लेक्स संचार चैनल प्रदान करता है।

+0

जबकि मैं आपके उत्तर की सराहना करता हूं, मैं एक आधिकारिक उत्तर की तलाश में हूं, "क्या एएसपी.नेट थ्रेड जिसे एसिंक हैंडलर के माध्यम से बुलाया जाता है, भरोसेमंद प्रसंस्करण जारी रखता है भले ही मैं जावास्क्रिप्ट रीडायरेक्ट का उपयोग कर पेज से दूर नेविगेट करता हूं?" –

+0

नया बनाया गया थ्रेड सर्वर पर अकेले चल रहा है जिसमें ब्राउजर के पेज से कोई संबंध नहीं है (स्टेटलेस)। उन दोनों के बीच कोई संबंध नहीं है जो उपयोगकर्ता को किसी अन्य पृष्ठ पर रीडायरेक्ट करते समय थ्रेड को समाप्त कर सकता है। लेकिन मुझे लगता है कि मुझे एक स्रोत की आवश्यकता होगी। –