2011-02-09 13 views
6

मेरे पास एक जावा सर्वलेट है जो क्लाइंट अनुरोधों द्वारा चरम घंटों के दौरान अधिभारित हो रहा है। कुछ ग्राहक समवर्ती अनुरोध करते हैं। कभी-कभी प्रति सेकंड अनुरोधों की संख्या बहुत बढ़िया है।क्लाइंट को ओवरलोडिंग सर्वर से रोकें?

क्या मुझे आवेदन तर्क लागू करने की आवश्यकता है ताकि ग्राहक प्रति सेकंड भेज सकें? क्या यह आवेदन स्तर पर किया जाना चाहिए?

+3

इसमें अधिक हार्डवेयर फेंको। –

+0

जब तक सभी अनुरोध मान्य नहीं होते हैं, तब तक मैं एनन से सहमत हूं, उस पर अधिक हार्डवेयर फेंक दूंगा (सबसे आसान) या अपने जावा सर्वलेट को अनुकूलित करें। यदि अनुरोध स्पैम हैं तो आप iptables या अपाचे स्तर ब्लॉक – Nick

+1

जैसे कुछ का उपयोग करके उन्हें निम्न परत पर अवरुद्ध कर सकते हैं। उनका प्रश्न मान्य है। हार्डवेयर को संभालने से हमेशा अधिक अनुरोध हो सकते हैं। सर्वर को अनुरोधों को सीमित करने के लिए एक तरीका चाहिए और अब अत्यधिक भार के दौरान सिस्टम को नीचे लाएं। –

उत्तर

1

यह संभालने के दो सबसे आम तरीके सर्वर को बहुत व्यस्त होने पर अनुरोधों को बंद करना है, या प्रत्येक अनुरोध को धीमा करना है।

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

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

दोनों java.util.concurrent में कक्षाओं में से किसी एक के माध्यम से संवाद कर सकते हैं, जैसे LinkedBlockingQueue या ThreadPoolExecutor। यदि आप वास्तव में फैंसी प्राप्त करना चाहते हैं, तो आप कुछ ग्राहकों के सामने कुछ ग्राहकों की सेवा के लिए PriorityBlockingQueue जैसे कुछ का उपयोग कर सकते हैं। कुछ ठोस जवाब यहां)

1

;

मैं, मैं और अधिक हार्डवेयर इसे फेंक की तरह Anon कहा। मुझे लगता है कि जाने के लिए रास्ता अधिक हार्डवेयर है। बहुत सारे ग्राहक या ट्रैफ़िक होने के कारण आमतौर पर एक अच्छी समस्या है।

हालांकि, अगर आपको बिल्कुल ग्राहकों को थ्रॉटल करना होगा, तो कुछ विकल्प हैं।

सबसे अधिक स्केलेबल समाधान जिन्हें मैंने एक वितरित कैशिंग सिस्टम, जैसे मेमकैच किया गया है, और गणना रखने के लिए पूर्णांक का उपयोग करके घूमते देखा है।

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

उदाहरण के लिए, यदि आप 10 अनुरोध/सेकेंड को संभाल सकते हैं, तो अधिकतम 5 तक, प्रत्येक 5 सेकंड में 50 की गिनती रखें। इस तरह आप इसे हर समय refilling नहीं कर रहे हैं, लेकिन आप भी संभाल सकते हैं खिड़की तक सीमित फटने का थोड़ा सा। एक अच्छी ताज़ा दर खोजने के लिए आपको प्रयोग करने की आवश्यकता होगी। यदि आप इस तरह से प्रतिबंधित करने की आवश्यकता है तो इस काउंटर की कुंजी या तो वैश्विक कुंजी हो सकती है, या उपयोगकर्ता आईडी पर आधारित हो सकती है।

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

यह सब कहा जा रहा है, मैं पहले अन्य विकल्पों की जांच करता हूं। अपने ग्राहकों को थ्रॉटल करना आम तौर पर उन्हें परेशान करने का एक अच्छा तरीका है। शायद सबसे अच्छा विचार नहीं है। :)

+0

यदि आप किसी ग्राहक को थ्रॉटल करने में सफल हैं, तो आपको मृत शरीर को समझा देना होगा। लेकिन वे अब नाराज नहीं होंगे :-) –

+1

एक ग्राहक को त्वचा के लिए एक से अधिक तरीके हैं ... बिल्ली। – rfeak

1

मुझे लगता है कि आप क्षमता बढ़ाने (या तो हार्डवेयर या सॉफ़्टवेयर के माध्यम से) की स्थिति में नहीं हैं, और आपको वास्तव में केवल अपने सर्वर पर बाहरी रूप से लगाए गए लोड को सीमित करने की आवश्यकता है।

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

यदि आप टोमकैट का उपयोग कर रहे हैं, तो आप maxThreads और acceptCount सेटिंग्स के माध्यम से अनुमत अनुरोधों की अधिकतम संख्या को कॉन्फ़िगर कर सकते हैं। इन पर अधिक जानकारी के लिए http://tomcat.apache.org/tomcat-6.0-doc/config/http.html पर परिचय पढ़ें।

अधिक उन्नत नियंत्रण (जैसे प्रति उपयोगकर्ता प्रतिबंध) के लिए, यदि आप अपाचे के माध्यम से प्रॉक्सी कर रहे हैं, तो आप स्थिति से निपटने में मदद के लिए विभिन्न मॉड्यूल का उपयोग कर सकते हैं। Google के लिए कुछ मॉड्यूल हैं, सीमित हैं cipipconn, mod_bw, और mod_cband। ये संभवतः आपके ऐप्स द्वारा प्रदान किए जाने वाले बुनियादी नियंत्रणों की तुलना में स्थापित और समझने में काफी कठिन हैं, इसलिए आप बस उन लोगों के साथ रहना चाहेंगे।

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