sql >> Databáze >  >> NoSQL >> MongoDB

Problémy s připojením MongoDB v Azure

Několik tisíc požadavků za minutu je velké zatížení a jediný způsob, jak to udělat správně, je řídit a omezovat maximální počet vláken, která by mohla být spuštěna najednou.

Protože není zveřejněno mnoho informací o tom, jak jste to implementovali. Uvedu několik možných okolností.

Čas experimentovat...

Konstanty:

  • Položky ke zpracování:
    • 50 za sekundu , nebo jinými slovy...
    • 3 000 za minutu , a ještě jeden způsob, jak se na to podívat...
    • 180 000 za hodinu

Proměnné:

  • Rychlost přenosu dat:

    • Kolik dat můžete přenést za sekundu, bude hrát roli bez ohledu na to, co děláme, a to se bude v průběhu dne lišit v závislosti na denní době.

      Jediné, co můžeme udělat, je odpálit více požadavků z různých procesorů, abychom rozložili váhu provozu, který posíláme tam a zpět.

  • Výkon zpracování:

    • Předpokládám, že to máte v WebJob na rozdíl od toho, aby to bylo kódováno uvnitř webu MVC, je to samo. Je to vysoce neefektivní a nehodí se k účelu, kterého se snažíte dosáhnout. Pomocí WebJob můžeme zařadit do fronty pracovní položky, které mají být zpracovány jinými WebJobs . Fronta jde o Azure Queue Úložiště .

Problémy:

  • Pokoušíme se dokončit 50 transakcí za sekundu, takže pokud bychom využívali 50 vláken, každá transakce by měla být provedena za méně než 1 sekundu. Náš 45sekundový oddechový čas nemá v tuto chvíli žádný smysl.
  • Očekáváme, že poběží 50 vláken souběžně a všechna budou dokončena za méně než sekundu, každou sekundu, na jednom procesoru. (Tady přeháním, jen abych uvedl pointu... ale představte si, že každou sekundu stáhnete 50 textových souborů. Zpracováváte to a pak se to snažím střílet zpět kolegovi v naději, že budou vůbec připraveni chytit to)
  • Musíme mít zavedenou logiku opakování. Pokud po 3 pokusech není položka zpracována, je třeba ji umístit zpět do fronty. V ideálním případě bychom měli serveru poskytnout více času na reakci než jen jednu sekundu s každým selháním, řekněme, že jsme mu dali 2 sekundy pauzu při prvním selhání, pak 4 sekundy, pak 10, což značně zvýší pravděpodobnost, že vydržíme. / získávání dat, která jsme potřebovali.
  • Předpokládáme že naše MongoDb dokáže zpracovat tento počet požadavků za sekundu. Pokud jste to ještě neudělali, začněte hledat způsoby, jak to škálovat, problém není ve skutečnosti, že jde o MongoDb, datová vrstva mohla být cokoli, jde o to, že takový počet požadavků posíláme z jediný zdroj, který bude nejpravděpodobnější příčinou vašich problémů.

Řešení:

  1. Nastavte WebJob a pojmenujte jej EnqueueJob . Tento WebJob bude mít jediný účel, zařadit položky práce ke zpracování do Queue Storage .
  2. Vytvořte Queue Storage Container s názvem WorkItemQueue , bude tato fronta fungovat jako spouštěč pro další krok a odstartuje naše operace škálování.
  3. Vytvořte další WebJob s názvem DequeueJob . Tento WebJob bude mít také jediný účel, vyřadit pracovní položky z fronty WorkItemQueue a spusťte požadavky do vašeho úložiště dat.
  4. Nakonfigurujte DequeueJob pro otočení, jakmile bude položka umístěna do WorkItemQueue , spusťte v každém 5 samostatných vláken a dokud fronta není prázdná, vyřaďte z fronty pracovní položky pro každé vlákno a pokuste se provést vyřazenou úlohu.
    1. Pokus 1, pokud selže, počkejte a zkuste to znovu.
    2. Pokus 2, pokud selže, počkejte a zkuste to znovu.
    3. Pokud se pokus 3 nezdaří, zařaďte položku zpět do WorkItemQueue
  5. Nakonfigurujte svůj web tak, aby se automaticky škáloval na x počet procesorů (všimněte si, že váš web a webové úlohy sdílejí stejné zdroje)

Zde je krátké 10minutové video který poskytuje přehled o tom, jak využívat frontová úložiště a webové úlohy.

Upravit:

Dalším důvodem, proč se vám tyto chyby mohou zobrazovat, mohou být také dva další faktory, opět způsobené tím, že je v aplikaci MVC...

Pokud kompilujete aplikaci pomocí DEBUG Atribut byl použit, ale tlačí se RELEASE místo toho můžete narazit na problémy kvůli nastavení v web.config , bez DEBUG ASP.NET webová aplikace spustí požadavek po dobu maximálně 90 sekund, pokud požadavek trvá déle, požadavek zlikviduje.

Chcete-li prodloužit časový limit na více než 90 sekund budete muset změnit [httpRuntime][3] vlastnost ve vašem web.config ...

<!-- Increase timeout to five minutes -->
<httpRuntime executionTimeout="300" />

Další věc, kterou si musíte být vědomi, je nastavení časového limitu požadavku vašeho prohlížeče> webové aplikace, řekl bych, že pokud trváte na tom, abyste kód ponechali v MVC, než abyste jej extrahovali a vložili do WebJob, pak můžete pomocí následujícího kódu spustit požadavek do vaší webové aplikace a kompenzovat časový limit požadavku.

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. Mongo agregace v časových intervalech

  2. Jak dynamicky vytvořit schéma Mongodb pomocí nodejs

  3. Řešení závodních podmínek a hladovění při generování jedinečných ID pomocí MongoDB + NodeJS

  4. loopback zahrnout do dotazu vzdálenou metodu