मैं nginx + gunicorn + django के शीर्ष पर लागू एक वेब सेवा पर काम कर रहा हूं। ग्राहक स्मार्टफोन अनुप्रयोग हैं। एप्लिकेशन को बाहरी एपीआई (फेसबुक, अमेज़ॅन एस 3 ...) में कुछ लंबी चलने वाली कॉल करने की आवश्यकता है, इसलिए सर्वर बस नौकरी सर्वर पर नौकरी कतार देता है (CeleryRedis से अधिक) का उपयोग कर।एक nginx/gunicorn/django वेब आर्किटेक्चर में लंबे समय तक चलने वाले HTTP कनेक्शन की कुशल हैंडलिंग
जब भी संभव हो, सर्वर ने नौकरी कतारबद्ध कर ली है, तो यह तुरंत वापस आती है, और HTTP कनेक्शन बंद हो जाता है। यह ठीक काम करता है और सर्वर को बहुत अधिक भार बनाए रखने की अनुमति देता है।
client server job server
. | |
. | |
|------HTTP request----->| |
| |--------queue job------>|
|<--------close----------| |
. | |
. | |
लेकिन कुछ मामलों में, ग्राहक को समाप्त होने के तुरंत बाद परिणाम प्राप्त करने की आवश्यकता होती है। दुर्भाग्यवश, HTTP कनेक्शन बंद होने के बाद सर्वर क्लाइंट से संपर्क करने का कोई तरीका नहीं है। एक समाधान क्लाइंट एप्लिकेशन पर भरोसा करना होगा जब तक कि नौकरी पूरी नहीं हो जाती है, सर्वर को हर कुछ सेकंड में मतदान करते हैं। यदि संभव हो, तो मैं इस समाधान से बचना चाहता हूं, क्योंकि अधिकतर यह सेवा की प्रतिक्रियाशीलता में बाधा डालता है, और यह भी क्योंकि यह सर्वर को कई अनावश्यक सर्वेक्षण अनुरोधों के साथ लोड करेगा।
संक्षेप में, मैं कुछ भी नहीं कर रहा हूं, कुछ भी नहीं कर रहा हूं (टीसीपी कनेक्शन को जीवित रखने के लिए हर बार एक व्हाइटस्पेस भेजकर, बस like Amazon S3 does), जब तक काम पूरा नहीं हो जाता है, और सर्वर परिणाम देता है।
client server job server
. | |
. | |
|------HTTP request----->| |
| |--------queue job------>|
|<------keep-alive-------| |
| [...] | |
|<------keep-alive-------| |
| |<--------result---------|
|<----result + close-----| |
. | |
. | |
मैं कैसे एक कुशल तरीके से लंबी चलने वाली HTTP कनेक्शन लागू कर सकते हैं, यह मानते हुए सर्वर बहुत अधिक लोड है (यह अभी तक ऐसा नहीं है, लेकिन लक्ष्य उच्चतम संभव लोड बनाए रखने के लिए सक्षम होने के लिए, प्रति सेकंड सैकड़ों या हजारों अनुरोधों के साथ)?
अन्य सर्वरों के लिए वास्तविक नौकरियों को ऑफ़लोड करना सर्वर पर कम CPU उपयोग सुनिश्चित करना चाहिए, लेकिन मैं सभी सर्वर की रैम को बढ़ाने और उपयोग करने से बचने के तरीकों से कैसे बच सकता हूं, या आने वाले अनुरोधों को बहुत से खुले कनेक्शन के कारण छोड़ दिया जा सकता है?
शायद यह ज्यादातर nginx और gunicorn को ठीक से कॉन्फ़िगर करने का विषय है। मैंने async workers based on greenlets in gunicorn के बारे में कुछ पढ़ा है: प्रलेखन का कहना है कि एसिंक श्रमिकों का उपयोग "" लंबे अवरुद्ध कॉल (आईई, बाहरी वेब सेवाओं) "करने वाले अनुप्रयोगों द्वारा किया जाता है, यह सही लगता है। यह भी कहता है "सामान्य रूप से, कोई एप्लिकेशन इन श्रमिक वर्गों का उपयोग करने में सक्षम होना चाहिए जिसमें कोई बदलाव नहीं है"। यह बहुत अच्छा लगता है। इस पर कोई प्रतिक्रिया?
आपकी सलाह के लिए धन्यवाद।
क्या आपने डीजेंगो के लिए AJAX 'लंबे मतदान' समाधानों का शोध किया है? यह मूल रूप से एक ही चीज़ की तरह लगता है। – dgel
हाँ, आप सही हैं, यह शायद वही बात है। AJAX का मतलब क्लाइंट पक्ष पर जावास्क्रिप्ट है, यह वेब ब्राउज़र के बारे में अधिक है, मेरे मामले में ग्राहक एक सॉफ्टफोन एप्लिकेशन है। लेकिन सर्वर की तरफ शायद लगभग एक ही, उत्कृष्ट विचार है। – MiniQuark