2011-11-29 4 views
6

के साथ टीसीपी सर्वर के लिए थ्रेडिंग और स्केलिंग मॉडल मैंने C10K दस्तावेज़ के साथ-साथ सॉकेट सर्वर को स्केल करने पर कई संबंधित कागजात पढ़ लिए हैं। सभी सड़कों को निम्नलिखित बिंदुओं पर इंगित करें:एपोल

  1. "प्रति कनेक्शन थ्रेड" की क्लासिक गलती से बचें।

  2. चयन पर एपोल पसंद करें।

  3. इसी तरह, यूनिक्स में विरासत async io तंत्र का उपयोग करना मुश्किल हो सकता है।

मेरा सरल टीसीपी सर्वर सिर्फ समर्पित पोर्ट पर श्रवण सॉकेट पर क्लाइंट कनेक्शन के लिए सुनता है। नया कनेक्शन प्राप्त करने पर, अनुरोध को पारदर्शी करता है, और प्रतिक्रिया वापस भेजता है। फिर सॉकेट को गर्व से बंद कर देता है।

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

लेकिन यदि मैं एकाधिक धागे और एकाधिक सीपीयू कोर का लाभ उठाने के लिए इसे स्केल करना चाहता हूं तो क्या होगा? मूल विचार है कि स्प्रिंग्स को दिमाग में यह है:

टीसीपी सुनो सॉकेट पर आने वाले कनेक्शन सुनने के लिए एक समर्पित धागा। फिर सभी सक्रिय समवर्ती ग्राहक कनेक्शन को संभालने के लिए एन थ्रेड्स (या थ्रेड पूल) का एक सेट। फिर कुछ थ्रेड सुरक्षित तरीके का आविष्कार करें जिसमें श्रवण धागा उपलब्ध कार्यकर्ता धागे में से एक को नया कनेक्शन (सॉकेट) "प्रेषित करेगा"। (विंडोज़ में एला आईओसीपी)। कार्यकर्ता धागा उन सभी कनेक्शनों पर एक एपोल लूप का उपयोग करेगा जो यह करने के लिए किया जा रहा है कि एकल थ्रेडेड दृष्टिकोण क्या करेगा।

क्या मैं सही रास्ते पर हूं? या क्या एकाधिक थ्रेड पर एपोल के साथ एक टीसीपी सर्वर करने के लिए एक मानक डिजाइन पैटर्न है?

सुझाव कैसे थ्रेड पूल के लिए एक नया कनेक्शन प्रेषण करेगा?

+0

यदि आपकी भाषा की पसंद लचीला है, तो आप http://vibed.org/ को आजमा सकते हैं जो एसिंक प्रोग्रामिंग की असीमित प्रकृति को सार तत्वित करता है ताकि आप अभी भी एक तुल्यकालिक तरीके से प्रोग्राम प्राप्त कर सकें। उदा। यूबेट [] buf = new ubyte [] (1024); ऑटो डेटा = conn.read (buf); conn.write (डेटा); – rmc

उत्तर

-1

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

2
  1. सबसे पहले, ध्यान दें कि यह सी * 10 के * है। यदि आप लगभग 100 (एक सामान्य प्रणाली पर) से कम हैं तो खुद से चिंता न करें। फिर भी यह पर निर्भर करता है आपके सॉकेट कर रहे हैं।
  2. हां, लेकिन ध्यान रखें कि epoll मैनिपुलेशन के लिए सिस्टम कॉल की आवश्यकता होती है, और उनकी लागत कुछ fd_set स्वयं प्रबंधित करने की लागत से अधिक महंगा हो सकती है या नहीं। यह poll के लिए जाता है। कम कीमत पर उपयोगकर्ता पुनरावृत्ति में प्रत्येक पुनरावृत्ति में प्रसंस्करण करने के लिए सस्ता है।
  3. असिंक्रोनस आईओ बहुत दर्दनाक है जब आप केवल कुछ सॉकेट तक सीमित नहीं हैं जिन्हें आप आवश्यकतानुसार जोड़ सकते हैं। अधिकांश लोग इवेंट लूप का उपयोग करके सामना करते हैं, लेकिन यह टुकड़े और आपके प्रोग्राम प्रवाह को बदल देते हैं।यह आमतौर पर इस उद्देश्य के लिए बड़े, अनावश्यक रूपरेखाओं का उपयोग करने की आवश्यकता होती है क्योंकि एक विश्वसनीय और तेज़ घटना लूप सही नहीं है।

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

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

आपके द्वारा प्रस्तावित प्रेषण मॉडल सामान्य पहला चरण समाधान है यदि आपके प्रतिक्रिया उत्पन्न करने के लिए महंगे हैं। आप या तो फोर्क या धागे का उपयोग कर सकते हैं। एक थ्रेड को फोर्किंग या उत्पन्न करने की लागत को पूलिंग तंत्र का चयन करने पर विचार नहीं किया जाना चाहिए: बल्कि आपको को सिस्टम पर लोड किए गए लोड को ऑर्डर या ऑर्डर करना चाहिए।

एकाधिक एपोल loops पर बैचिंग सॉकेट अत्यधिक है। यदि आप इस हताश हैं तो कई प्रक्रियाओं का उपयोग करें। ध्यान दें कि कई धागे और प्रक्रियाओं से सॉकेट पर accept संभव है।

+0

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