MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Проблеми с връзката с MongoDB на Azure

Няколко хиляди заявки в минута самного натоварване и единственият начин да го направите правилно е чрез контролиране и ограничаване на максималния брой нишки, които могат да се изпълняват във всеки един момент.

Тъй като няма публикувана много информация за това как сте приложили това. Ще разгледам няколко възможни обстоятелства.

Време е за експеримент...

Константите:

  • Елементи за обработка:
    • 50 в секунда , или с други думи...
    • 3000 на минута , и още един начин да го разгледаме...
    • 180 000 на час

Променливите:

  • Скорост на трансфер на данни:

    • Колко данни можете да прехвърлите в секунда ще играе роля, независимо какво правим, и това ще варира през целия ден в зависимост от времето на деня.

      Единственото нещо, което можем да направим, е да задействаме повече заявки от различни процесори, за да разпределим теглото на трафика, който изпращаме обратно.

  • Мощност на обработка:

    • Предполагам, че имате това в WebJob за разлика от кодирането на това в самия сайт на MVC. Това е изключително неефективно и не е подходящо за целта, която се опитвате да постигнете. С помощта на WebJob можем да поставим на опашка работни елементи, които да бъдат обработени от други WebJobs . Опашката въпросната е Azure Queue Съхранение .

Проблемите:

  • Опитваме се да извършим 50 транзакции в секунда, така че всяка транзакция трябва да бъде извършена за по-малко от 1 секунда, ако използваме 50 нишки. Нашият 45-секунден тайм-аут няма смисъл в този момент.
  • Очакваме 50 нишки да работят едновременно и всички да завършват за по-малко от секунда, всяка секунда, на един процесор. (Тук преувеличавам нещо, само за да кажа нещо... но си представете да изтегляте 50 текстови файла всяка секунда. Обработвате го, след което се опитвате да го изпратите обратно на колега с надеждата, че дори ще са готови хвани го)
  • Трябва да имаме въведена логика за повторен опит, ако след 3 опита елементът не бъде обработен, той трябва да бъде поставен обратно в опашката. В идеалния случай трябва да предоставим повече време на сървъра да отговори от само една секунда при всеки отказ, да кажем, че сме му дали 2 секунди прекъсване при първия отказ, след това 4 секунди, след това 10, това значително ще увеличи шансовете ни да продължим / извличане на данните, от които се нуждаехме.
  • Ние предполагаме че нашият MongoDb може да се справи с този брой заявки в секунда. Ако още не сте го направили, започнете да търсите начини да го мащабирате, проблемът не е във факта, че това е MongoDb, слоят данни може да е бил всичко, фактът е, че правим този брой заявки от един единствен източник, който ще бъде най-вероятната причина за вашите проблеми.

Решението:

  1. Настройте WebJob и го наименувайте EnqueueJob . Тази WebJob ще има една единствена цел, да постави на опашка работни елементи, които да бъдат обработени в Queue Storage .
  2. Създайте Queue Storage Container с име WorkItemQueue , тази опашка ще действа като тригер за следващата стъпка и ще постави началото на нашите операции за мащабиране.
  3. Създайте друга WebJob с име DequeueJob . Тази WebJob също ще има една единствена цел, да извади от опашката работните елементи от WorkItemQueue и изстреляйте заявките към вашето хранилище за данни.
  4. Конфигурирайте DequeueJob за завъртане, след като даден елемент е поставен в WorkItemQueue , стартирайте 5 отделни нишки на всяка и докато опашката не е празна, извадете от опашката работни елементи за всяка нишка и се опитайте да изпълните изтеглената от опашката задача.
    1. Опит 1, ако е неуспешен, изчакайте и опитайте отново.
    2. Опит 2, ако е неуспешен, изчакайте и опитайте отново.
    3. Опит 3, ако е неуспешен, поставете елемент обратно в WorkItemQueue
  5. Конфигурирайте уебсайта си за автоматично мащабиране до 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();
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да съхранявам резултати от динамично генерирани формуляри в MongoDb?

  2. Една публикация крие вложени полета от друга публикация

  3. приложението изтече при свързване към MongoLab от Heroku

  4. mongodb:вмъкнете, ако не съществува

  5. MongoDB:Комбинирайте текстово търсене и геопространствена заявка