प्रति मिनट कुछ हज़ार अनुरोध बड़ा . है लोड, और इसे सही तरीके से करने का एकमात्र तरीका है, किसी एक समय में चलने वाले थ्रेड्स की अधिकतम संख्या को नियंत्रित और सीमित करना।
चूंकि आपने इसे कैसे कार्यान्वित किया है, इस बारे में अधिक जानकारी पोस्ट नहीं की गई है। मैं कुछ संभावित परिस्थितियों को कवर करने जा रहा हूँ।
प्रयोग करने का समय...
स्थिरांक:
- प्रसंस्करण के लिए आइटम:
- 50 प्रति सेकंड , या दूसरे शब्दों में...
- 3,000 प्रति मिनट , और इसे देखने का एक और तरीका...
- 180,000 प्रति घंटा
चर:
-
डेटा स्थानांतरण दरें:
-
आप प्रति सेकंड कितना डेटा ट्रांसफर कर सकते हैं, यह एक भूमिका निभाने वाला है, इससे कोई फर्क नहीं पड़ता कि हम क्या करते हैं, और यह दिन के समय के आधार पर पूरे दिन अलग-अलग होगा।
केवल एक चीज जो हम कर सकते हैं, वह यह है कि हम जो ट्रैफ़िक भेज रहे हैं, उसे वितरित करने के लिए विभिन्न सीपीयू से अधिक अनुरोधों को हटा दें।
-
-
प्रसंस्करण शक्ति:
-
मुझे लगता है कि आपके पास यह
WebJob
. में है एमवीसी साइट के अंदर इसे कोड करने के विरोध में यह स्वयं है। यह अत्यधिक अक्षम है और उस उद्देश्य के लिए उपयुक्त नहीं है जिसे आप प्राप्त करने का प्रयास कर रहे हैं। वेबजॉब का उपयोग करके हम कतार . कर सकते हैं अन्यWebJobs
. द्वारा संसाधित किए जाने वाले कार्य आइटम . कतार विचाराधीन है Azure Queue संग्रहण .
-
समस्याएं:
- हम प्रति सेकंड 50 लेन-देन पूरा करने का प्रयास कर रहे हैं, इसलिए यदि हम 50 थ्रेड्स का उपयोग कर रहे हैं तो प्रत्येक लेन-देन 1 सेकंड से कम समय में हो जाना चाहिए। हमारा 45 सेकंड का टाइम आउट इस समय कोई उद्देश्य नहीं है।
- हम उम्मीद कर रहे हैं कि 50 थ्रेड एक साथ चलेंगे, और सभी एक सेकेंड में, हर सेकेंड में, एक सीपीयू पर पूरे हो जाएंगे। (मैं यहां एक बिंदु बढ़ा रहा हूं, बस एक बिंदु बनाने के लिए ... लेकिन कल्पना करें कि हर एक सेकंड में 50 टेक्स्ट फाइलें डाउनलोड करें। इसे संसाधित करना, फिर इसे एक सहयोगी को वापस शूट करने की कोशिश करना, उम्मीद है कि वे भी तैयार होंगे इसे पकड़ो)
- हमें एक पुन:प्रयास तर्क की आवश्यकता है, यदि 3 प्रयासों के बाद भी आइटम संसाधित नहीं होता है, तो उन्हें वापस कतार में रखने की आवश्यकता होती है। आदर्श रूप से हमें प्रत्येक विफलता के साथ केवल एक सेकंड की तुलना में प्रतिक्रिया देने के लिए सर्वर को अधिक समय प्रदान करना चाहिए, मान लें कि हमने इसे पहली विफलता पर 2 सेकंड का ब्रेक दिया, फिर 4 सेकंड, फिर 10, यह हमारे लगातार बने रहने की संभावना को बहुत बढ़ा देगा / वह डेटा प्राप्त करना जिसकी हमें आवश्यकता थी।
- हम मान रहे हैं कि हमारा MongoDb प्रति सेकंड अनुरोधों की इस संख्या को संभाल सकता है। यदि आपने पहले से नहीं किया है, तो इसे स्केल करने के तरीकों को देखना शुरू करें, समस्या यह नहीं है कि यह एक MongoDb है, डेटा स्तर कुछ भी हो सकता है, यह तथ्य है कि हम इस संख्या से अनुरोध कर रहे हैं एकमात्र स्रोत जो आपकी समस्याओं का सबसे संभावित कारण बनने जा रहा है।
समाधान:
- एक
WebJob
सेट करें और इसे नाम देंEnqueueJob
. यहWebJob
एक ही उद्देश्य होगा, काम की वस्तुओं कोQueue Storage
में संसाधित करने के लिए कतारबद्ध करना . - एक
Queue Storage Container
नामWorkItemQueue
, यह कतार अगले चरण के लिए एक ट्रिगर के रूप में कार्य करेगी और हमारे स्केलिंग आउट कार्यों को शुरू करेगी। - एक और
WebJob
बनाएं नामDequeueJob
. यहWebJob
इसका एक ही उद्देश्य होगा,WorkItemQueue
. से कार्य आइटम को हटाना और अनुरोधों को अपने डेटा स्टोर से हटा दें। DequeueJob
कॉन्फ़िगर करें एक बार आइटम कोWorkItemQueue
के अंदर रखने के बाद स्पिन करने के लिए , प्रत्येक पर 5 अलग-अलग थ्रेड शुरू करें और जब कतार खाली न हो, प्रत्येक थ्रेड के लिए कार्य आइटम को हटा दें और हटाए गए कार्य को निष्पादित करने का प्रयास करें।- प्रयास 1 विफल होने पर, प्रतीक्षा करें और पुनः प्रयास करें।
- प्रयास 2, असफल होने पर, प्रतीक्षा करें और पुनः प्रयास करें।
- प्रयास 3, विफल होने पर, आइटम को
WorkItemQueue
पर वापस संलग्न करें
- अपनी वेबसाइट को सीपीयू की x राशि तक ऑटोस्केल आउट करने के लिए कॉन्फ़िगर करें (ध्यान दें कि आपकी वेबसाइट और वेब जॉब समान संसाधन साझा करते हैं)
यहां 10 मिनट का एक छोटा वीडियो है जो क्यू स्टोरेज और वेब जॉब का उपयोग करने के बारे में एक सिंहावलोकन देता है।
संपादित करें:
एक और कारण हो सकता है कि आप उन त्रुटियों को दो अन्य कारकों के कारण भी प्राप्त कर सकते हैं, फिर से यह एक एमवीसी ऐप में होने के कारण हो सकता है...
यदि आप एप्लिकेशन को DEBUG
. के साथ संकलित कर रहे हैं विशेषता लागू की गई लेकिन RELEASE
. को आगे बढ़ाया गया संस्करण के बजाय, आप अपने web.config
. में सेटिंग के कारण समस्याओं का सामना कर सकते हैं , बिना DEBUG
. के विशेषता, एक ASP.NET वेब एप्लिकेशन अधिकतम 90 सेकंड के लिए अनुरोध चलाएगा, यदि अनुरोध इससे अधिक समय लेता है, तो यह अनुरोध का निपटान करेगा।
समयबाह्य को 90 सेकंड से अधिक समय तक बढ़ाने के लिए आपको [httpRuntime][3]
. को बदलना होगा आपके web.config
. में प्रॉपर्टी ...
<!-- Increase timeout to five minutes -->
<httpRuntime executionTimeout="300" />
दूसरी चीज जिसके बारे में आपको पता होना चाहिए वह है आपके ब्राउज़र> वेब ऐप की रिक्वेस्ट टाइमआउट सेटिंग्स, मैं कहूंगा कि यदि आप कोड को एमवीसी में रखने पर जोर देते हैं, तो इसे निकालने और इसे वेबजॉब में डालने का विरोध करते हैं, तो आप आपके वेब ऐप पर अनुरोध को सक्रिय करने और अनुरोध के समयबाह्य को ऑफसेट करने के लिए निम्नलिखित कोड का उपयोग कर सकते हैं।
string html = string.Empty;
string uri = "http://google.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Timeout = TimeSpan.FromMinutes(5);
using (HttpWebResponse response = (HttpWebResonse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
html = reader.ReadToEnd();
}