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ýmiWebJobs
. 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í:
- Nastavte
WebJob
a pojmenujte jejEnqueueJob
. TentoWebJob
bude mít jediný účel, zařadit položky práce ke zpracování doQueue Storage
. - Vytvořte
Queue Storage Container
s názvemWorkItemQueue
, bude tato fronta fungovat jako spouštěč pro další krok a odstartuje naše operace škálování. - Vytvořte další
WebJob
s názvemDequeueJob
. TentoWebJob
bude mít také jediný účel, vyřadit pracovní položky z frontyWorkItemQueue
a spusťte požadavky do vašeho úložiště dat. - Nakonfigurujte
DequeueJob
pro otočení, jakmile bude položka umístěna doWorkItemQueue
, 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.- Pokus 1, pokud selže, počkejte a zkuste to znovu.
- Pokus 2, pokud selže, počkejte a zkuste to znovu.
- Pokud se pokus 3 nezdaří, zařaďte položku zpět do
WorkItemQueue
- 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();
}