2010-03-17 19 views
5

मैं एक साधारण बहु socketserver लिख रहा हूँ और मैं कैसे सबसे अच्छा इनकमिंग कनेक्शन को संभालने के लिए सोच रहा हूँ:जावा सॉकेटसेवर: कई आने वाले कनेक्शन कैसे संभालें?

  1. प्रत्येक नए कनेक्शन के लिए एक नया धागा पैदा करते हैं। समवर्ती धागे की संख्या सीमित है और इंतज़ार कर कनेक्शन बैकलॉग

  2. एक कतार में आने वाले सभी कनेक्शन जोड़ सकते हैं और कार्यकर्ता धागे कि कतार की प्रक्रिया

मैं के लिए इच्छुक हूँ का एक पूल है निर्दिष्ट करने के द्वारा ही सीमित होगा विकल्प 2 के लिए जाएं क्योंकि मैं वास्तव में उच्च लोड के तहत भी किसी भी कनेक्शन को अस्वीकार नहीं करना चाहता हूं, लेकिन मुझे आश्चर्य है कि क्या कोई विचार है कि मुझे प्रभावी असीमित कनेक्शन स्वीकार करने के बारे में पता होना चाहिए?

उत्तर

6

असीमित कनेक्शन के साथ आप संभावित रूप से बड़ी संख्या में धागे बना सकते हैं। इसका मतलब है कि बहुत सारी प्रसंस्करण की आवश्यकता होती है, साथ ही प्रत्येक धागा डिफ़ॉल्ट रूप से केवल ढेर के लिए स्मृति की निश्चित मात्रा का उपभोग करेगा (मुझे लगता है कि यह आंकड़ा 512kb प्रति थ्रेड है, लेकिन यह प्लेटफॉर्म निर्भर हो सकता है)।

एक निश्चित संख्या में धागे को पूल करके और सीमित संख्या में ग्राहकों को स्वीकार करके आप सुनिश्चित करेंगे कि आपके कुछ क्लाइंट उचित समय अवधि में सर्विस किए जाएंगे, और आपका सर्वर ओवरलोडिंग से नहीं गिर जाएगा।

आप this article on building servers using NIO देख सकते हैं या शायद Apache Mina जैसे ढांचे की जांच कर सकते हैं।

+0

हूँ एक (मैं तय मानें कि आकार) थ्रेड पूल के रूप में किया जा रहा है धागे की संख्या असीमित नहीं होगी और इसके बजाय पूल के आकार से घिरा हुआ होगा। – objects

+0

क्षमा करें - सोचें कि मैंने 'मतदान' लिखकर मामलों को भ्रमित कर दिया है, 'पूलिंग' नहीं –

+0

ठीक है, – objects

2

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

+0

या आप स्मृति से बाहर हो जाएंगे। – user359996

2

1 प्रति कनेक्शन थ्रेड स्केल नहीं करता है। C10K समस्या पर इसके बारे में पढ़ें। यह एक लंबा पढ़ा है, लेकिन बहुत प्रसिद्ध है।

मैं NIO के बारे में जानने की सलाह दूंगा या इसके बजाय प्रभावशाली netty फ्रेमवर्क का उपयोग करूंगा जो आपके लिए सभी भारी भारोत्तोलन (एनआईओ) को संभालता है।

4

मैं वास्तव में किसी भी कनेक्शन

वास्तव में आप शायद करना मना करने के लिए नहीं करना चाहती। जब आप ओवरलोड हो जाते हैं, तो आप स्वीकार करने से पहले वर्तमान लोड से छुटकारा पाने के लिए पर्याप्त क्षमता बनाए रखना चाहते हैं। किसी भी रुकावट को धीमा करने के लिए कनेक्शन को अस्वीकार करने से ज्यादा स्वीकार्य नहीं है।

क्यूइंग सिद्धांत कहता है कि मीठा स्थान लगभग 70% उपयोग है। यदि आपके सर्वर के पास स्थिर लोड होने की तुलना में अधिक तेज़ हार्डवेयर होने वाला है, तब तक यह तेज़ हार्डवेयर नहीं मिलता है।

यह कहकर कि, यदि आप सैकड़ों हजारों कनेक्शन की उम्मीद कर रहे हैं तो मैं थ्रेड पूल या एनआईओ का उपयोग करूंगा। यदि आप केवल हजारों की उम्मीद कर रहे हैं, तो प्रति कनेक्शन एक थ्रेड जाने का सबसे आसान तरीका है।

0

मैं वास्तव में यहां तक ​​कि उच्च भार

आपका विकल्प 2 मेरी राय में जाने के लिए एक ही रास्ता है के तहत, किसी भी कनेक्शन मना करने के लिए नहीं करना चाहती। आपके पास प्रत्येक 5-10k कनेक्शन प्रति एक पिन किए गए एनआईओ चयनकर्ता धागे होना चाहिए। लेकिन इस महत्वपूर्ण धागे में कुछ भी देरी नहीं हो सकती है, इसलिए आप एक निश्चित संख्या में पिन किए गए धागे के बीच काम वितरित करने के लिए एक DEMUX का उपयोग करते हैं और थ्रेड पूल पर नहीं। और काम करने और ग्राहकों को जवाब देने के लिए एक एमयूएक्स। चूंकि ईजेपी ने कहा, यदि आपके कार्यकर्ता धागे लगी हुई हैं, तो अंततः आपको कनेक्शन कनेक्शन छोड़ना होगा जब तक कि आप अपनी कतार को जितनी संभव हो सके बनाने के लिए डिस्क पर संदेशों को डंप करना शुरू नहीं करते। इस तरह वाई उच्च भार के तहत भी, किसी भी कनेक्शन को छोड़ नहीं होगा। आप देख सकते हैं this article जो विस्तार से यह समझाने और नीचे चित्र:

enter image description here

अस्वीकरण: मैं CoralQueue के डेवलपर्स से एक

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