2012-06-23 13 views
21

क्या यह स्केलेबल एचटीपी लिस्टनर का एक अच्छा उदाहरण होगा जो बहु-थ्रेडेड है?मल्टी-थ्रेडेड एचटीपी लिस्टनर का इंतजार एसिंक और कार्य

क्या यह उदाहरण के लिए एक वास्तविक आईआईएस ऐसा करेगा?

public class Program 
{ 
    private static readonly HttpListener Listener = new HttpListener(); 

    public static void Main() 
    { 
     Listener.Prefixes.Add("http://+:80/"); 
     Listener.Start(); 
     Listen(); 
     Console.WriteLine("Listening..."); 
     Console.WriteLine("Press any key to exit..."); 
     Console.ReadKey(); 
    } 

    private static async void Listen() 
    { 
     while (true) 
     { 
      var context = await Listener.GetContextAsync(); 
      Console.WriteLine("Client connected"); 
      Task.Factory.StartNew(() => ProcessRequest(context)); 
     } 

     Listener.Close(); 
    } 

    private static void ProcessRequest(HttpListenerContext context) 
    { 
     System.Threading.Thread.Sleep(10*1000); 
     Console.WriteLine("Response"); 
    } 
} 

मैं विशेष रूप से एक स्केलेबल समाधान की तलाश में हूं जो आईआईएस पर भरोसा नहीं करता है। इसके बजाय केवल http.sys (जो प्रेजेंटप्लिस्टर क्लास है) पर - आईआईएस पर भरोसा न करने का कारण यह है क्योंकि सरकार। जिस क्षेत्र में मैं काम करता हूं उसके लिए हमले के अत्यधिक सतह क्षेत्र की आवश्यकता होती है।

उत्तर

19

मैंने https://github.com/JamesDunne/Aardwolf पर कुछ ऐसा किया है और इस पर कुछ व्यापक परीक्षण किया है।

कोर इवेंट लूप के कार्यान्वयन के लिए https://github.com/JamesDunne/aardwolf/blob/master/Aardwolf/HttpAsyncHost.cs#L107 पर कोड देखें।

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

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

मैंने पाया है, प्रयोगात्मक रूप से (मेरे हार्डवेयर पर), 128 के मूल्यों के मानते हैं कि स्वीकार्य प्रतिक्रिया समय पर सर्वर बड़ी मात्रा में समवर्ती कनेक्शन (1,024 तक) को संभालने की अनुमति देता है। अपने हार्डवेयर का उपयोग करके परीक्षण करें और तदनुसार अपने पैरामीटर को ट्यून करें।

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

सारांश: आप कैसे अपना कनेक्शन स्वीकार करते हैं लूप आपके सर्वर की स्केलेबिलिटी के लिए महत्वपूर्ण है।

+0

लिंक मृत हैं ... –

+0

अपडेट किए गए लिंक। टिप्पणी के लिए धन्यवाद! –

+0

क्या सेमफोर और सर्विसपॉइंट मैनेजर का उपयोग करने में कोई अंतर है। डीफॉल्टकनेक्शन लिमिट? –

5

तकनीकी रूप से आप सही हैं। इसे स्केलेबल बनाने के लिए आप शायद एक ही समय में एकाधिक GetContextAsync चलाना चाहते हैं (प्रदर्शन परीक्षण को वास्तव में कितने पता होना चाहिए, लेकिन "प्रत्येक कोर के लिए कुछ" शायद सही जवाब है)।

फिर स्वाभाविक रूप से, टिप्पणियों के अनुसार इंगित किया गया; आईआईएस का उपयोग नहीं करने का मतलब है कि आपको कई चीजों के लिए सुरक्षा के बारे में बहुत गंभीर होना चाहिए IIS आपको "मुफ्त में" देता है।

1

मुझे पता है कि मैं इस पर पार्टी के लिए बहुत देर से हूं, लेकिन मैंने NuGet पर एक लाइब्रेरी (स्रोत https://github.com/jchristn/WatsonWebserver) प्रकाशित किया जो एसिंक वेबसर्वर को समाहित करता है।