Няколко хиляди заявки в минута самного натоварване и единственият начин да го направите правилно е чрез контролиране и ограничаване на максималния брой нишки, които могат да се изпълняват във всеки един момент.
Тъй като няма публикувана много информация за това как сте приложили това. Ще разгледам няколко възможни обстоятелства.
Време е за експеримент...
Константите:
- Елементи за обработка:
- 50 в секунда , или с други думи...
- 3000 на минута , и още един начин да го разгледаме...
- 180 000 на час
Променливите:
-
Скорост на трансфер на данни:
-
Колко данни можете да прехвърлите в секунда ще играе роля, независимо какво правим, и това ще варира през целия ден в зависимост от времето на деня.
Единственото нещо, което можем да направим, е да задействаме повече заявки от различни процесори, за да разпределим теглото на трафика, който изпращаме обратно.
-
-
Мощност на обработка:
-
Предполагам, че имате това в
WebJob
за разлика от кодирането на това в самия сайт на MVC. Това е изключително неефективно и не е подходящо за целта, която се опитвате да постигнете. С помощта на WebJob можем да поставим на опашка работни елементи, които да бъдат обработени от другиWebJobs
. Опашката въпросната е Azure Queue Съхранение .
-
Проблемите:
- Опитваме се да извършим 50 транзакции в секунда, така че всяка транзакция трябва да бъде извършена за по-малко от 1 секунда, ако използваме 50 нишки. Нашият 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 количество CPU (имайте предвид, че вашият уебсайт и уеб заданията споделят едни и същи ресурси)
Ето кратко 10-минутно видео който дава общ преглед на това как да се използват хранилища на опашки и уеб задания.
Редактиране:
Друга причина, поради която може да получавате тези грешки, може да се дължи и на два други фактора, отново причинени от това, че е в MVC приложение...
Ако компилирате приложението с DEBUG
приложен атрибут, но натискане на RELEASE
вместо това може да се натъкнете на проблеми поради настройките във вашия web.config
, без DEBUG
атрибут, уеб приложение на ASP.NET ще изпълни заявка за максимум 90 секунди, ако заявката отнеме повече от това време, то ще изхвърли заявката.
За да увеличите времето за изчакване до повече от 90 секунди ще трябва да промените [httpRuntime][3]
свойство във вашия web.config
...
<!-- Increase timeout to five minutes -->
<httpRuntime executionTimeout="300" />
Другото нещо, с което трябва да сте наясно, са настройките за изчакване на заявката на вашия браузър> уеб приложение, бих казал, че ако настоявате да запазите кода в MVC, вместо да го извличате и поставяте в WebJob, тогава вие може да използва следния код, за да задейства заявка към вашето уеб приложение и да компенсира времето за изчакване на заявката.
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();
}