2016-11-14 12 views
6

काम पर हमारे पास अब हर समय है और फिर अनुरोध करता है कि उस समय तक लौटने के लिए इतना लंबा होगा, फ्रंटेंड (nginx) पहले ही कनेक्शन को मार डाला है, इसलिए उपयोगकर्ता आउटपुट नहीं देख पाएगा (या तो अगर यह अच्छा या बुरा है)।प्रोग्रामेटिक रूप से एक अनुरोध रोकें

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

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

तो कुछ तर्क दिए गए (शायद Products.LongRequestLogger का उपयोग कर रहे हैं जो हम पहले से ही उपयोग कर रहे हैं) क्या थ्रेड प्रसंस्करण को रोकने के लिए अनुरोध करने का कोई तरीका है?

उत्तर

1

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

मैं 200 - 400 लेखकों के साथ दिन में 1000 - 3000 वस्तुओं को प्रकाशित/संशोधित करने वाली कुछ बड़ी योजनाएं चला रहा हूं। आम तौर पर भार पूरे दिन फैलता है, इसलिए उचित अनुरोध समय में भी लंबे समय तक अनुरोध संसाधित किया जा रहा है।

उदाहरण के लिए शाम को, एलएस लंबे अनुरोध (30s-60s) अच्छी तरह से कर रहे हैं। उन्हें निरस्त करने का कोई कारण नहीं है।

प्लोन में हमारे पास कुछ क्लासिक लंबे अनुरोध हैं, जैसे बड़े पेड़ का नाम बदलें/स्थानांतरित करें, अनुमतियां बदलें, कई ऑब्जेक्ट्स कॉपी करें। फिर आमतौर पर संघर्ष सूची में कहीं होता है और 3 रिट्रीज़ के बाद लेनदेन को बंद कर देता है।

लंबे अनुरोध को छोड़कर आप बस प्लोन से कुछ विशेषताओं को हटा दें। आप नाम बदलने/स्थानांतरित करने के लिए एक शर्त जोड़ने पर विचार कर सकते हैं, इसलिए यदि वे कंटेनर में उदाहरण के लिए 1000 ऑब्जेक्ट्स हैं, तो वे अब वहां नहीं हैं।

मैं क्या करने की कोशिश की/अब तक क्या किया: (Haha, मैं अब बस कहा लेकिन मुश्किल :-) प्राप्त करने के लिए)

  • लंबे अनुरोध कम बनाओ -> उदाहरण चेकआउट इस package's copy/move patch के लिए: यह कोई करता है अब नामकरण और चलने के लिए एक अनिश्चित सूची/कैटलॉग कर रहे हैं, इसके बजाय यह केवल आवश्यक अनुक्रमणिका अद्यतन करता है। हमने इस के साथ बहुत कुछ हासिल किया।

  • पंक्तियां: उदाहरण के लिए मैंने क्यूई के लिए रेडिस का उपयोग किया और ज्ञात लंबे कार्यों को संभाला। बेशक आपको पहले से ही पता होना चाहिए, जो एक संभावित लंबा अनुरोध है, लेकिन मुझे लगता है कि आप इसे अपने पर्यावरण में पहले ही जानते हैं। अगर अनुरोध किया जाता है तो आप उपयोगकर्ता द्वारा ईमेल से संपर्क कर सकते हैं, या किसी प्रकार का फ्लैश संदेश संपर्क कर सकते हैं।

  • रखें सूची संभव के रूप में छोटे, Solr/elasticsearch के लिए सब कुछ प्रतिनिधि (निकाला जा रहा SearchableText आप एक बहुत देता है ...)

  • हार्डवेयर: मैं जानता हूँ कि मूर्खतापूर्ण लगता है, लेकिन इस बार एक त्वरित जीत है । राम में कम से कम सभी कैटलॉग ऑब्जेक्ट्स लोड करने का प्रयास करें। एक तेज सीपीयू/एसएसडी (सामान्य I/O) में कुछ $ निवेश करें। यह मुझे पसंद नहीं है, लेकिन ऐसा होता है और वर्ष 2016 में यह आपको लंबी अनुरोध की समस्या को हल करने के लिए कुछ समय दे सकता है।

भविष्य:

  • आप शायद जिम Fultons "The ZODB" talk at the ploneconf 2016 देखा। यदि आप ज़ीक्लिएंट पर संघर्ष समाधान को संभाल सकते हैं और आपको ऑब्जेक्ट को केवल राज्य ही मिला है, तो बेहतर संघर्ष समाधान लागू करना संभव हो सकता है।

Ehhh ... सबसे पहले मैं सिर्फ एक टिप्पणी की है, लेकिन मैं पार कर वर्ण सीमा ;-)

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