मैंने सर्वर के एक सेट के लिए रिवर्स प्रॉक्सी के रूप में Nginx का उपयोग करना शुरू कर दिया है जो किसी प्रकार की सेवा प्रदान करता है।
सेवा कई बार धीमी हो सकती है (इसके जावा और JVM पर चलने पर कभी-कभी "पूर्ण कचरा संग्रह" में फंस जाता है) जिसमें कई सेकंड लग सकते हैं, इसलिए मैंने proxy_connect_timeout
2 सेकंड में सेट किया है, जो Nginx को आंकड़ा बनाने के लिए पर्याप्त समय देगा बाहर सेवा जीसी पर अटक गई है और समय पर जवाब नहीं देगी, और इसे एक अलग सर्वर को अनुरोध पारित करना चाहिए।
मैंने proxy_read_timeout
रिवर्स प्रॉक्सी को अटकने से रोकने के लिए भी सेट किया है यदि सेवा को प्रतिक्रिया की गणना करने में बहुत अधिक समय लगता है - फिर से, इसे दूसरे सर्वर पर अनुरोध को स्थानांतरित करना चाहिए जो समय पर प्रतिक्रिया वापस करने के लिए पर्याप्त मुक्त होना चाहिए।
मैंने कुछ मानदंड चलाए हैं और मैं स्पष्ट रूप से देख सकता हूं कि proxy_connect_timeout
ठीक से काम करने वाले कुछ कनेक्शन कनेक्शन टाइमआउट के लिए निर्दिष्ट समय पर वापस आते हैं, क्योंकि सेवा अटकी हुई है और आने वाले कनेक्शन को स्वीकार नहीं करता है (सेवा जेट्टी को एम्बेडेड के रूप में उपयोग कर रही है सर्वलेट कंटेनर)। यह proxy_read_timeout
भी काम करता है, क्योंकि मैं उन अनुरोधों को देख सकता हूं जो वहां निर्दिष्ट टाइमआउट के बाद वापस आते हैं।
समस्या यह है कि मैंने कुछ अनुरोधों को देखने की अपेक्षा की होगी जो समय समाप्त होने के बाद proxy_read_timeout + proxy_connect_timeout
या लगभग उस समय की लंबाई है, यदि सेवा अटक गई है और कनेक्शन को स्वीकार नहीं करेगा, जब निग्नेक्स इसे एक्सेस करने की कोशिश करता है, लेकिन इससे पहले कि निग्नेक्स समय-आउट कर सकता है - यह जारी हो जाता है और प्रसंस्करण शुरू होता है, लेकिन बहुत धीमा है और रीड टाइमआउट की वजह से Nginx गर्भपात करेगा। मेरा मानना है कि सेवा में ऐसे मामले हैं, लेकिन कई बेंचमार्क चलाने के बाद, कई लाखों अनुरोधों को पूरा करने में - मैं एक भी अनुरोध को देखने में विफल रहा proxy_read_timeout
जो ऊपर की किसी भी चीज़ में वापस लौटता है (जो कि बड़ा समय है)।
मैं इस मुद्दे पर किसी भी टिप्पणी की सराहना करता हूं, हालांकि मुझे लगता है कि नग्नेक्स में एक बग के कारण हो सकता है (मुझे अभी तक कोड को देखना है, इसलिए यह सिर्फ एक धारणा है) कि कनेक्शन के बाद टाइमआउट काउंटर को रीसेट नहीं किया जाता है सफल है, अगर नग्नेक्स ने अपस्ट्रीम सर्वर से कुछ भी नहीं पढ़ा।
proxy_read_timeout
है कि "ग्लोबल टाइमआउट" नहीं है, लेकिन 2 रीड ऑपरेशंस के बीच।
proxy_read_timeout + proxy_connect_timeout
।