2013-02-10 38 views
5

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

आईआईएस/एएसपी.NET ImageResizer मॉड्यूल के लेखक, नाथानाल जोन्स द्वारा this article के आधार पर, मैंने स्थिर फाइलों की सेवा के "इष्टतम" प्रदर्शन के लिए आवश्यक कुछ पूर्वकल्पनाओं को विकसित किया है। कि जीवन का सार:

  1. एक HttpModule का प्रयोग करें यह बहुत ASP.NET पाइपलाइन में जल्दी है, क्योंकि (कम पाइपलाइन = अधिक अनुकूलित) और एक HttpHandler से बात की इस तरह से निपटने के लिए आसान हो करने के लिए पता चला है।
  2. Response.WriteFile(filename)Response.Write(memBuffer) से बेहतर है जहां memBuffer एक इन-मेमोरी सी # बफर है।
  3. एक यूआरएल फिर से लिखना (यानी Context.RewritePath(virtualPath)) Response.WriteFile(filename) से बेहतर है, क्योंकि यह आईआईएस स्थिर फ़ाइल हैंडलर का उपयोग करेगा, जो अच्छी तरह अनुकूलित है।

मुसीबत, कुछ विचित्र कैशिंग मुद्दा मैं अब भी के नीचे (here), मेरे URL रीराइट तकनीक ही व्यवहार नहीं करने के लिए नहीं मिल सकता करने के लिए धन्यवाद है।

तो अब मैं निम्नलिखित की तरह एक और अधिक वेब एपीआई केंद्रित कार्यान्वयन के बारे में सोच रहा छोड़ दिया है:

public Task<HttpResponseMessage> DoTheFoo() 
{ 
    return Task<HttpResponseMessage>.Factory.StartNew(() => 
    { 
     var response = new HttpResponseMessage(); 
     response.Headers.Add("Content-Disposition", "inline; filename=\"" + attachmentFileName + "\""); 
     response.Headers.Add("content-type", mimeType); 
     response.Content = new StreamContent(File.OpenRead("somefile.doc")); 

     return response; 
    }); 
} 

एक वेब एपीआई समाधान इस स्पष्ट रूप से चीजों को थोड़ा neater बनाता है के लिए, के बाद से की फ़ाइल सेवारत भागों सेवा नियंत्रकों में अन्य कार्यों के साथ सही हो सकती है, लेकिन यह प्रदर्शन करने और पैमाने पर कितनी अच्छी तरह से चल रही है? जिन कारकों पर मैं विचार करता हूं:

  1. नेटवर्क बैंडविड्थ। संभवतः यहां कोई अंतर नहीं है, सभी तकनीकें बाइट्स की एक ही संख्या लिख ​​रही हैं।
  2. आउटगोइंग नेटवर्क स्ट्रीम को लिखने की गति। आईआईएस स्थैतिक फ़ाइल हैंडलर एएसपी.नेट पाइपलाइन की तुलना में थोड़ा बेहतर हो सकता है? शायद एकीकृत पाइपलाइन के साथ एक मुद्दा कम? सेवा उपभोक्ता स्तर के जोड़े-सौ-सौ केबीटीएस डीएसएल लाइन के बीच किसी भी चीज़ पर सेवा कर रही है, जो कि एक जीबीबी लैन तक है।
  3. रैम उपयोग। मुझे लगता है कि स्ट्रीमकंटेंट कार्यान्वयन आईआईएस स्थिर फ़ाइल हैंडलर के रूप में उतना कुशल नहीं होगा।
  4. सीपीयू उपयोग। रैम के साथ, मुझे लगता है कि स्ट्रीमकंटेंट आईआईएस स्थिर फ़ाइल हैंडलर की तुलना में थोड़ा अधिक मांग करने जा रहा है।
  5. सर्वर-साइड कैशिंग। आईआईएस स्थिर फ़ाइल हैंडलर यह प्रदान करता है (और यह ठीक है जो मुझे परेशानी दे रहा है क्योंकि यह खुद से व्यवहार नहीं कर रहा है), लेकिन मान लीजिए कि मैं इसे स्वयं व्यवहार कर सकता हूं, जो स्ट्रीमकंटेंट कार्यान्वयन से पहले लाभ प्रदान करने जा रहा है। मैं इस पहलू के बारे में बहुत चिंतित नहीं हूं, हालांकि सेवा को विभिन्न फ़ाइल अनुरोधों के जवाब देने की अधिक संभावना है, जैसा कि वही बार-बार विरोध करता है।

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

+0

यदि आप वार्निश को इसके सामने रखते हैं तो मैं केवल एक वेब एपीआई/डब्ल्यूसीएफ/एमवीसी समाधान का उपयोग करने पर विचार करता हूं; यह एक रैम और समवर्ती दृष्टिकोण से भयानक है। ImageResizer का डिस्क कैश गैर-छवि डेटा के लिए खुला है - क्या आपने बस इसका उपयोग करने पर विचार किया है? –

+0

कैशिंग से प्रदर्शन सुधार (और वार्निश, जहां तक ​​मैं कह सकता हूं, एक कैशिंग टूल है) वास्तव में मेरी चिंताओं का कम से कम है। जैसा कि मैंने उपरोक्त कहा है: "सेवा कई अलग-अलग फाइल अनुरोधों का जवाब देने की अधिक संभावना है, जैसा कि वही बार-बार विरोध करता है"। यदि कोई दोहराना अनुरोध नहीं होता है, तो कैश अप्रभावी होगा। इसके अलावा, ऐसे प्राधिकरण नियम हैं जिन्हें प्रत्येक अनुरोध के साथ संसाधित करने की आवश्यकता है, जो मुझे लगता है कि वार्निश काम करने के तरीके से, क्या समस्याएं पैदा होंगी? – Snixtor

+0

@ कॉम्प्यूटर भाषाविद आप वेब एपीआई को रैम और समवर्ती दृष्टिकोण से "भयानक" के रूप में वर्णित करते हैं। लेकिन यह विकल्प के खिलाफ कैसे खड़ा है? मैं "300 - 1000x" प्रदर्शन लाभ के बारे में बात नहीं कर रहा हूं वार्निश कैश्ड परिदृश्यों में दावा कर रहा है, एक तरफ कैश कर रहा हूं, मैं अनचाहे अनुरोधों के कच्चे प्रदर्शन को देख रहा हूं, क्योंकि मुझे लगता है कि मेरी अधिकांश सेवाओं का काम होगा झूठ। – Snixtor

उत्तर

1

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

+0

प्रश्नोत्तर पर मेरा इरादा आईआईएस में होस्ट किया जाना था, जो मुझे नहीं लगता कि एज़ूर ब्लॉब डाटा स्टोरेज के लिए एक मैच है? यह _different_ दृष्टिकोण के लिए एक दिलचस्प विचार है, यदि आवश्यक नहीं है तो मेरी स्थिति पर लागू होता है। – Snixtor

+0

तो आप छवियों/स्थैतिक संसाधनों को स्टोर करने के लिए केवल ब्लॉब स्टोरेज का उपयोग करेंगे। इन्हें सीडीएन सेवा के माध्यम से HTTP (एस) पर परोसा जाएगा। –

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

  • कोई संबंधित समस्या नहीं^_^