के साथ टीसीपी सर्वर के लिए थ्रेडिंग और स्केलिंग मॉडल मैंने C10K दस्तावेज़ के साथ-साथ सॉकेट सर्वर को स्केल करने पर कई संबंधित कागजात पढ़ लिए हैं। सभी सड़कों को निम्नलिखित बिंदुओं पर इंगित करें:एपोल
"प्रति कनेक्शन थ्रेड" की क्लासिक गलती से बचें।
चयन पर एपोल पसंद करें।
इसी तरह, यूनिक्स में विरासत async io तंत्र का उपयोग करना मुश्किल हो सकता है।
मेरा सरल टीसीपी सर्वर सिर्फ समर्पित पोर्ट पर श्रवण सॉकेट पर क्लाइंट कनेक्शन के लिए सुनता है। नया कनेक्शन प्राप्त करने पर, अनुरोध को पारदर्शी करता है, और प्रतिक्रिया वापस भेजता है। फिर सॉकेट को गर्व से बंद कर देता है।
मुझे लगता है कि मेरे पास एपोल का उपयोग करके एक थ्रेड पर इसे स्केल करने के तरीके पर एक अच्छा संभाल है। बस एक लूप जो सुनने के सॉकेट के साथ-साथ मौजूदा क्लाइंट कनेक्शन के लिए epoll_wait को कॉल करता है। बदले में, कोड नए बनाए गए नए क्लाइंट कनेक्शन के साथ-साथ मौजूदा कनेक्शन की स्थिति का प्रबंधन करेगा, इस पर निर्भर करता है कि किस सॉकेट को अभी संकेत दिया गया है। और कनेक्शन कनेक्शन टाइमआउट, सॉकेट की सुंदर समापन, और प्रत्येक कनेक्शन के लिए कुशल संसाधन आवंटन का प्रबंधन करने के लिए शायद कुछ तर्क। काफी सरल लगता है।
लेकिन यदि मैं एकाधिक धागे और एकाधिक सीपीयू कोर का लाभ उठाने के लिए इसे स्केल करना चाहता हूं तो क्या होगा? मूल विचार है कि स्प्रिंग्स को दिमाग में यह है:
टीसीपी सुनो सॉकेट पर आने वाले कनेक्शन सुनने के लिए एक समर्पित धागा। फिर सभी सक्रिय समवर्ती ग्राहक कनेक्शन को संभालने के लिए एन थ्रेड्स (या थ्रेड पूल) का एक सेट। फिर कुछ थ्रेड सुरक्षित तरीके का आविष्कार करें जिसमें श्रवण धागा उपलब्ध कार्यकर्ता धागे में से एक को नया कनेक्शन (सॉकेट) "प्रेषित करेगा"। (विंडोज़ में एला आईओसीपी)। कार्यकर्ता धागा उन सभी कनेक्शनों पर एक एपोल लूप का उपयोग करेगा जो यह करने के लिए किया जा रहा है कि एकल थ्रेडेड दृष्टिकोण क्या करेगा।
क्या मैं सही रास्ते पर हूं? या क्या एकाधिक थ्रेड पर एपोल के साथ एक टीसीपी सर्वर करने के लिए एक मानक डिजाइन पैटर्न है?
सुझाव कैसे थ्रेड पूल के लिए एक नया कनेक्शन प्रेषण करेगा?
यदि आपकी भाषा की पसंद लचीला है, तो आप http://vibed.org/ को आजमा सकते हैं जो एसिंक प्रोग्रामिंग की असीमित प्रकृति को सार तत्वित करता है ताकि आप अभी भी एक तुल्यकालिक तरीके से प्रोग्राम प्राप्त कर सकें। उदा। यूबेट [] buf = new ubyte [] (1024); ऑटो डेटा = conn.read (buf); conn.write (डेटा); – rmc