2016-09-29 9 views
17

पर http abort/close का प्रचार करें मेरे पास एक Django एप्लिकेशन वेब एप्लिकेशन है, और मैं सोच रहा था कि क्या nginx uwsgi/Django के पास/बंद करने के लिए संभव था।एनजीएक्सएक्स से uwsgi/Django

मूल रूप से मैं जानता हूँ कि nginx समय से पहले बीच में बंद करें/के बारे में पता पास uwsgi_ignore_client_abort "बंद" क्योंकि यह चूक है, और आप अपने nginx लॉग में nginx 499 त्रुटियों जब अनुरोध निरस्त किया गया/बंद कर दिया प्रतिक्रिया भेजे जाने से पहले कर रहे हैं। एक बार uwsgi अनुरोध को संसाधित करने के बाद यह एक "आईओ त्रुटि" फेंकता है जब यह nginx पर प्रतिक्रिया वापस करने के लिए जाता है।

uwsgi_ignore_client_abort को "चालू" पर बदलना सिर्फ nginx को निरस्त/बंद करने से अनजान बनाता है, और uwsgi "IO त्रुटियों" को हटा देता है क्योंकि uwsgi अभी भी nginx पर वापस लिख सकता है।

मेरा उपयोग मामला यह है कि मेरे पास एक ऐसा एप्लिकेशन है जहां लोग कुछ AJAX परिणामों के माध्यम से बहुत जल्दी परिणाम देते हैं, और इसलिए यदि मैं जल्दी से पेज के माध्यम से लंबित AJAX अनुरोध को छोड़ देता हूं, तो यह क्लाइंट को साफ और कुशल रखता है । लेकिन यह सर्वर पक्ष (uwsgi/Django) के लिए कुछ भी नहीं करता है क्योंकि उन्हें अभी भी प्रत्येक अनुरोध को संसाधित करना पड़ता है भले ही प्रतिक्रिया के लिए कुछ भी इंतजार नहीं करेगा।

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

तो क्या यह संभव है? uwsgi's हरियाकारी सेटिंग मुझे लगता है कि यह कुछ स्तर पर है .... बस यह नहीं पता कि इसे कैसे किया जाए।

+0

यूडब्ल्यूएसजीआई और एनजीआईएनएक्स मेलिंग सूचियों पर क्यों नहीं पूछना है? – silpol

+2

हाँ कोई बुरा विचार नहीं है। मैंने यूडब्ल्यूएसजीआई के आईआरसी चैनल को आजमाया लेकिन मुझे नहीं लगता कि मैंने खुद को समझाते हुए बहुत अच्छा काम किया है। मुझे लगता है कि शायद मैं फिर से इस सवाल से जुड़ने की कोशिश कर सकता हूं। – byoungb

+1

बस जिज्ञासु, uwsgi एक is_connected समारोह है। ऐसे मामलों में जहां आपने कनेक्शन समाप्त कर दिया है, क्या यह फ़ंक्शन गलत है? ऐसा लगता है कि समस्या वास्तव में uwsgi पक्ष पर है क्योंकि Nginx दस्तावेज़ों का कहना है कि सेटिंग proxy_ignore_client_abort और uwsgi_ignore_client_abort दोनों deafult द्वारा बंद हैं। – jaywhy13

उत्तर

2

अब स्पष्ट रूप से कुछ पेज हो सकते हैं, जहां मैं किसी भी कारण से समय से पहले निरस्त होने का अनुरोध नहीं करना चाहता हूं।

यह एक तरफ या दूसरे को लेने के पीछे ठीक समस्या है।

  • जाहिर है, आप एक कनेक्शन है कि के बाद से निरस्त कर दिया गया है, उदाहरण के लिए, एक महंगी तलाशी अभियान प्रसंस्करण खर्च सिस्टम संसाधन जारी रखने के लिए नहीं कर सकते हैं।

  • लेकिन फिर कनेक्शन शायद इतना महत्वपूर्ण था कि क्लाइंट डिस्कनेक्ट होने पर भी इसे संसाधित करना होगा।

    • जैसे, बहुत ही महंगा तलाशी अभियान है, लेकिन वास्तव में ग्राहक विशिष्ट नहीं है कि, और बाद में सभी ग्राहकों के लिए nginx द्वारा कैश किया जाएगा, भी।

    • या शायद एक ऑपरेशन जो आपके आवेदन की स्थिति को संशोधित करता है - आप स्पष्ट रूप से अपने आवेदन को असंगत स्थिति नहीं लेना चाहते हैं!

के रूप में उल्लेख किया है, समस्या, uWSGI साथ है nginx साथ नहीं। हालांकि, आप यूडब्ल्यूएसजीआई को स्वचालित रूप से तय नहीं कर सकते कि आपका इरादा क्या था, बिना आप अपने आप को इस तरह के इरादे को प्रकट करने के बिना।

और आप अपने कोड में अपना इरादा वास्तव में कैसे प्रकट करेंगे? प्रोग्रामिंग भाषाओं का एक पूरा समूह वास्तव में बहुप्रचारित और/या असीमित प्रोग्रामिंग मॉडल का समर्थन नहीं करता है, जो इसे संचालन रद्द करने के लिए पूरी तरह से गैर-तुच्छ बनाता है।

इस प्रकार, यहां कोई जादू समाधान नहीं है।Even the concurrency-friendly programming languages like Golang are having issues around the WithCancelcontext - आपको इसे हर फंक्शन कॉल में पास करना पड़ सकता है जो संभवतः ब्लॉक कर सकता है, जिससे कोड बहुत बदसूरत हो जाता है।

क्या आप पहले से ही डीजेगो में उपर्युक्त संदर्भ कर रहे हैं? यदि नहीं, तो समाधान बदसूरत लेकिन बहुत सरल है - किसी भी समय आप स्पष्ट रूप से अनुरोध निरस्त कर सकते हैं, जाँच ग्राहक अभी भी uwsgi.is_connected(uwsgi.connection_fd()) साथ जुड़ा हुआ है या नहीं:

5

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

क्लाइंट पक्ष पर AJAX अनुरोध को छोड़कर XMLHttpRequest.abort() के माध्यम से किया जाता है। अगर अनुरोध अभी तक नहीं भेजा गया है जब abort() कहा जाता है, तो अनुरोध बाहर नहीं जाएगा। लेकिन अगर अनुरोध भेजा गया है, सर्वर नहीं जानता कि अनुरोध निरस्त कर दिया गया है। कनेक्शन बंद नहीं होगा, सर्वर पर कोई भी संदेश नहीं भेजा जाएगा, कुछ भी नहीं। यदि आप सर्वर को यह जानना चाहते हैं कि अनुरोध की आवश्यकता नहीं है, तो आपको मूल रूप से अनुरोधों की पहचान करने के लिए एक तरीके से आने की आवश्यकता है ताकि जब आप प्रारंभिक अनुरोध करते हैं तो आपको इसके लिए पहचानकर्ता मिल जाएगा। फिर, एक और AJAX अनुरोध के माध्यम से आप सर्वर को बता सकते हैं कि पहले का अनुरोध रद्द कर दिया जाना चाहिए। (आप abort()like this one के बारे में सवाल खोज और "सर्वर" खोजते हैं तो आप एक ही कह स्पष्टीकरण मिल जाएगा।)

ध्यान दें कि uwsgi_ignore_client_abort कुछ है कि टीसीपी स्तर पर कनेक्शन बंद से संबंधित है। AJAX अनुरोध को निरस्त करने से यह एक अलग बात है। आमतौर पर जावास्क्रिप्ट में कोई कार्रवाई नहीं की जा सकती है जो को एक टीसीपी कनेक्शन बंद कर देगा। ब्राउज़र अपनी आवश्यकताओं के अनुरूप कनेक्शन के निर्माण और विनाश को अनुकूलित करता है।

  1. मैं किसी भी प्रक्रिया example.com करने के लिए एक कनेक्शन था कि क्या जांच करने के लिए इस्तेमाल किया lsof: बस अब, मैं ऐसा किया। कोई नहीं था। (lsof एक * निक्स उपयोगिता है जो खुली फाइलों को सूचीबद्ध करने की अनुमति देती है। नेटवर्क कनेक्शन * फाइलों में "फ़ाइलें" हैं।

  2. मैंने क्रोम में example.com पर एक पृष्ठ खोला। lsof ने कनेक्शन और प्रक्रिया को खोला जो इसे खोलता है।

  3. फिर मैंने पृष्ठ बंद कर दिया।

  4. मैंने lsof के साथ मतदान किया ताकि यह देखने के लिए कि क्या मैंने पहले कनेक्शन को खोला था या नहीं। यह पृष्ठ बंद करने के लगभग एक मिनट के लिए खुला रहता है, भले ही कनेक्शन को खोलने की कोई वास्तविक आवश्यकता न हो।

और वहाँ uswgi सेटिंग्स के साथ नगण्य का कोई राशि है कि इसके बारे में के माध्यम से XMLHttpRequest.abort()

प्रदर्शन रोकता बारे में पता होना कर देगा उपयोग हालत में आप दे दी है जहां उन कुछ के माध्यम से तेजी से पृष्ठन गया था है परिणाम है।मैं प्रश्न में दिए गए विवरण के लिए दो संभावनाएं देख सकता हूं:

  1. उपयोगकर्ता आगे पेजिंग से पहले ताज़ा करने की प्रतीक्षा करता है। उदाहरण के लिए, ऐलिस उपयोगकर्ता "ज़ेनो" के लिए क्रमबद्ध रूप से क्रमबद्ध उपयोगकर्ता नामों की एक सूची देख रहा है और प्रत्येक बार जब कोई नया पृष्ठ दिखाया जाता है, तो वह देखती है कि नाम वहां नहीं है और पेज नीचे हैं। इस मामले में, निरस्त करने के लिए कुछ भी नहीं है क्योंकि उपयोगकर्ता की कार्रवाई पहले को संभालने के अनुरोध पर निर्भर है। (उपयोगकर्ता को निर्णय लेने से पहले नया पृष्ठ देखना होगा।)

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

+0

दिलचस्प है क्योंकि मेरे परीक्षणों के साथ यह कुछ स्तर पर काम करता है ... (मैं uwsgi लॉग में देख सकता हूं और प्रत्येक निरस्त AJAX अनुरोध के लिए त्रुटि देख सकता हूं) मुझे आश्चर्य है कि मुझे अपनी रखरखाव सेटिंग्स या तथ्य यह है कि मैं वास्तविक कनेक्शन पथ हैप्रोक्सी -> nginx -> uwsgi -> django। – byoungb

+0

केवल उन्हीं सेटिंग्स जिन्हें मैं जानता हूं, एक कनेक्शन बंद होने के साथ एक्सएचआर निरस्त सहसंबंध को ब्राउज़र पक्ष पर कर सकते हैं। मुझे सेटिंग्स के बारे में दस्तावेज़ देखने को याद है जो ब्राउज़र को कनेक्शन को कितनी बार बंद कर सकता है बदल सकता है। संभवतः, ब्राउज़र को एक ब्राउज़र के साथ समाप्त करने के लिए सेटिंग सेट करना संभव होगा जो एक्सएचआर निरस्त होने पर लगभग तुरंत कनेक्शन बंद कर देगा। ध्यान दें कि ये डेवलपर्स के लिए सेटिंग्स हैं और कुछ लोग आमतौर पर उपयोग नहीं करते हैं। मैं यह भी देख सकता था कि प्रॉक्सी एक ब्राउज़र की तुलना में कनेक्शन को कितनी बार बंद कर सकता है। – Louis

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