2010-09-25 11 views
6

मैं अपने एएसपी निवल MVC आवेदन में इस तरह के तर्क लागू करना चाहते हैं:ASP.NET MVC बहु सूत्रण

user clicks a button ->

server executes some time-consuming logic in ~15 threads (i get data from really slow independent sources) ->

when all work is done, server merges the results and passes it back to user 

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

उत्तर

4

यदि आप .Net 4 का उपयोग कर रहे हैं, तो मैं समांतर नामस्थानों को देखने की भी सिफारिश करता हूं। वे इसे और भी सरल बनाते हैं और अपने सभी सीपीयू कोर का उपयोग करने का बेहतर काम करते हैं।

मैं इसे अपने मुख्य वेब ऐप से पूरी तरह से ऑफ़लोड करने पर भी विचार करूंगा। इस लंबे समय से चलने वाले अनुरोध को संभालने के लिए सेवाओं का एक अलग सेट या संदेश कतार होने से आपको बहुत अधिक आसानी से स्केल करने की सुविधा मिल जाएगी और आपके वेब ऐप को लंबे समय से चलने वाले तर्क प्रदर्शन न करने के लिए पेज अनुरोधों की सेवा करने की चिंता करने की अनुमति होगी। शुरू करने के लिए Google "आईआईएस लंबे समय से चलने वाले अनुरोध" की तरह कुछ करें।

3

क्योंकि एक ThreadPool करने के लिए है कि बनाया गया है:

यह सूत्र है कि कार्य, पोस्ट काम आइटम निष्पादित करने के लिए इस्तेमाल किया जा सकता का एक पूल प्रदान करता है, प्रक्रिया अतुल्यकालिक मैं/हे, अन्य धागे की ओर से प्रतीक्षा करें, और टाइमर प्रक्रिया।

मुझे लगता है कि जब वे किए जाते हैं तो डेटाबेस में परिणामों को अपने सर्वर पर स्टोर करना बेहतर होता है।

और फिर आप टाइमर और AJAX का समय-समय पर अनुरोध कर सकते हैं कि प्रक्रिया पूरी होने पर अनुरोध किया जाए, यदि ऐसा है, तो डेटा प्राप्त करें।

3

आपको अपने स्वयं के धागे नहीं बनाना चाहिए क्योंकि इसमें महत्वपूर्ण ओवरहेड है। एक नया धागा बनाना महंगा है। तो सवाल होना चाहिए: आप थ्रेडपूल का उपयोग क्यों नहीं करना चाहिए? इसमें उपयोग के लिए तैयार कई धागे हैं। कार्य समानांतर लाइब्रेरी का उपयोग करने के लिए एक बेहतर तरीका होगा, यह थ्रेडपूल के ऊपर अमूर्तता की एक परत प्रदान करता है जो धागे के साथ काम करना बहुत आसान बनाता है।

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

+0

यह व्यवस्थापक/मॉडरेटर द्वारा निष्पादित एक ऑपरेशन होगा, इसलिए यह nessesary नहीं है :) –

6

हाँ JQuery और कुछ AJAX इसे सबसे सही तरीके से करेंगे। पृष्ठ लोड करें, फिर सर्वर पर ~ 15 अलग अजाक्स प्रश्न भेजें और उन्हें अतुल्यकालिक रूप से समाप्त करने दें। इस तरह आप वेब-सर्वर को थ्रेडिंग (जो अच्छी तरह से करता है) को संभालने दे सकते हैं और प्रतीक्षा करते समय उपयोगकर्ता को टिकर या आभासी प्रगति पट्टी प्रदर्शित करने पर ध्यान केंद्रित कर सकते हैं।

+2

जब तक इस तरह से काम को तोड़ दिया जा सकता है, तो यह एक बहुत अच्छा दृष्टिकोण है ... अपने आप को रोल के नुकसान से बचने के अलावा धागे, उपयोगकर्ता प्रतिक्रिया के साथ यह बहुत आसान है क्योंकि यह साथ जाता है। –

+2

चाहे यह एक अच्छा दृष्टिकोण है, इस पर निर्भर करता है कि आप सर्वर या क्लाइंट पर परिणामों को मर्ज करना चाहते हैं या नहीं। जोखिम मौजूद है कि आपको क्लाइंट को बहुत सारे तर्क को स्थानांतरित करने की आवश्यकता है जिसे सर्वर पर बेहतर तरीके से संभाला जा सकता है। –

+0

यह पहली बार एक आसान फिक्स जैसा प्रतीत होता है, हालांकि यदि आपके ग्राहक के पास अलग-अलग टैबों में एक ही यूआरएल खुला है, तो आप प्रति ब्राउज़र एक डोमेन के लिए खुले कनेक्शन पर सीमाओं पर बहुत तेजी से ध्यान देंगे। (वेबसाइकिलों के साथ अब बहुत से लोग खोज रहे हैं) जिम लियोनार्डो ने प्रस्तावित किए गए तुलना में आपके सर्वर को 1/15 वें तक संभालने के कई अनुरोधों को भी कम कर दिया है। रोहन सिंह का जवाब कम जटिल है, और जिम के – Cohen

7

यह एएसपी.नेट एमवीसी 2 में नए AsycController का उपयोग करने के लिए वास्तव में एक अच्छी जगह की तरह लगता है 2. यह उपयोग करना वास्तव में आसान है और आपको अनुरोध धागे को अवरुद्ध किए बिना कई स्वतंत्र स्रोतों के खिलाफ क्वेरी चलाने देता है।

MSDN has a great example जहां वे एक समाचार सेवा, एक मौसम सेवा और एक खेल सेवा पूछ रहे हैं।

आप मूल कोड है कि वे एक स्रोत क्रमिक रूप से जानना चाहते हैं में देख सकते हैं, लेकिन अंतिम संस्करण में, सभी कार्य नियंत्रक के समानांतर और नियंत्रण रिटर्न में चला जब वे सभी पूरी कर ली हैं:

public void IndexAsync(string city) 
{ 
    AsyncManager.OutstandingOperations.Increment(3); 

    NewsService newsService = new NewsService(); 
    newsService.GetHeadlinesCompleted += (sender, e) => 
    { 
     AsyncManager.Parameters["headlines"] = e.Value; 
     AsyncManager.OutstandingOperations.Decrement(); 
    }; 
    newsService.GetHeadlinesAsync(); 

    SportsService sportsService = new SportsService(); 
    sportsService.GetScoresCompleted += (sender, e) => 
    { 
     AsyncManager.Parameters["scores"] = e.Value; 
     AsyncManager.OutstandingOperations.Decrement(); 
    }; 
    sportsService.GetScoresAsync(); 

    WeatherService weatherService = new WeatherService(); 
    weatherService.GetForecastCompleted += (sender, e) => 
    { 
     AsyncManager.Parameters["forecast"] = e.Value; 
     AsyncManager.OutstandingOperations.Decrement(); 
    }; 
    weatherService.GetForecastAsync(); 
} 

public ActionResult IndexCompleted(string[] headlines, string[] scores, string[] forecast) 
{ 
    return View("Common", new PortalViewModel { 
     NewsHeadlines = headlines, 
     SportsScores = scores, 
     Weather = forecast 
    }); 
} 
+0

बीटीडब्लू की तुलना में केवल थोड़ा कम पैमाने पर है कि लिंक अब – PandaWood

+0

टूटा हुआ है, यह एक यूआरएल एक वादा होना चाहिए, खासकर दस्तावेज जैसे कुछ। यह भी कष्टप्रद है कि यूआरएल केवल मामूली रूप से बदल गया है (किसी भी स्पष्ट कारण के लिए "(बनाम = v.100)" जोड़ना)। वैसे भी, इसे इंगित करने के लिए धन्यवाद, @ पांडावुड। अब तय –

+0

यह अब पुराना है क्योंकि एमवीसी 4+ नियंत्रकों में असिनक कार्यक्षमता शामिल है। यहां एक उदाहरण दिया गया है: http://www.asp.net/mvc/overview/performance/using-asynchronous-methods-in-aspnet-mvc-4 –