Es gadiem ilgi izmantoju HttpClient nepareizi, bet galu galā murgs nāca. Mana vietne bija nestabila, un mani klienti bija ļoti dusmīgi, un ar vienkāršu labojumu veiktspēja tika ievērojami uzlabota un nestabilitāte tika novērsta.
Tajā pašā laikā es faktiski uzlaboju savas lietojumprogrammas veiktspēju ar efektīvāku kontaktligzdas izmantošanu.
Mikropakalpojumi var būt grūti risināma problēma. Tā kā tiek pievienoti vairāk pakalpojumu un monolītas lietojumprogrammas tiek sadalītas, starp pakalpojumiem mēdz būt arvien vairāk saziņas ceļu. Ir daudz saziņas iespēju, bet HTTP ir ļoti populāra iespēja. Ja mikropakalpojums ir veidots C# vai jebkurā .NET valodā, iespējams, jūs jau izmantojat HttpClient.
Problēma slēpjas
Lietošanas priekšraksts ir C# funkcija, kas apstrādā vienreizējus objektus. Kad bloka izmantošana ir pabeigta, tad vienreizējais objekts (šajā gadījumā HttpClient) ir ārpus darbības jomas un tiek iznīcināts. Izsauciet iznīcināšanas metodi un notīriet visus izmantotos resursus. Tas ir ļoti tipisks .NET modelis, ko mēs izmantojam visam, sākot no datu bāzes līdz plūsmas rakstītājam. Faktiski jebkurš objekts ar ārēju resursu, kas jātīra, izmanto šo IDisposable interfeisu.
Un jūs nevarat vainot par to, ka vēlaties to iesaiņot lietošanā. Pirmkārt, tas tiek uzskatīts par labu praksi. Faktiski Microsoft oficiālā dokumentācija, izmantojot:
Kopumā, izmantojot IDisposable objektu, tas ir jādeklarē un jāinstancē lietošanas paziņojumā. Otrkārt, viss kods, ko jūs, iespējams, esat redzējis...... HttpClient sākumā jums būs jāizmanto paziņojuma bloks, ieskaitot jaunāko dokumentāciju ASP.NET pašas vietnes. Tas pats ir teikts rakstā internetā.
Bet HttpClient ir atšķirīgs. Lai gan tas ievieš IDisposable interfeisu, tas faktiski ir koplietots objekts. Tas nozīmē, ka aizkulisēs tas ir atkal ienācējs un drošs pavedieniem. HttpClient instance ir jākoplieto visā lietojumprogrammas darbības laikā, nevis jāizveido jauna instance katrai izpildei. HttpClient redzēsim, kāpēc.
Pārliecinieties, ka
Šeit ir vienkārša programma, lai demonstrētu HttpClient:
Tas tiks novirzīts uz http://aspnetmonsters.comAtveriet 10 pieprasījumus un veiciet GET, mēs vienkārši izdrukājam statusa kodu, lai mēs zinātu, ka tas darbojas. Rezultāts būs:
Pagaidiet, ir vairāk!
Viss darbs un viss ir pareizi pasaulei. izņemot to, ka tā nav. Ja mēs izvelkam netstat rīku un apskatīsim ligzdas statusu mašīnā, kurā tas darbojas, mēs redzēsim:
C:\code\socket>NETSTAT.EXE ... Proto vietējā adrese Ārvalstu adrese Valsts TCP 10.211.55.6:12050 waws-prod-bay-017:http TIME_WAIT TCP 10.211.55.6:12051 waws-prod-bay-017:http TIME_WAIT TCP 10.211.55.6:12053 waws-prod-bay-017:http TIME_WAIT TCP 10.211.55.6:12054 waws-prod-bay-017:http TIME_WAIT TCP 10.211.55.6:12055 waws-prod-bay-017:http TIME_WAIT TCP 10.211.55.6:12056 waws-prod-bay-017:http TIME_WAIT TCP 10.211.55.6:12057 waws-prod-bay-017:http TIME_WAIT TCP 10.211.55.6:12058 waws-prod-bay-017:http TIME_WAIT TCP 10.211.55.6:12059 waws-prod-bay-017:http TIME_WAIT TCP 10.211.55.6:12060 waws-prod-bay-017:http TIME_WAIT TCP 10.211.55.6:12061 waws-prod-bay-017:http TIME_WAIT TCP 10.211.55.6:12062 waws-prod-bay-017:http TIME_WAIT TCP 127.0.0.1:1695 SIMONTIMMS742B:1696 IZVEIDOTS ... Nu, tas ir dīvaini...... Lietojumprogramma ir izbeigusies, bet joprojām ir virkne šo savienojumu, kas ir atvērti Azure mašīnai, kas mitina ASP.NET Monsters vietni. Viņi irTIME_WAITstatuss, kas nozīmē, ka savienojums ir slēgts vienā pusē (mūsu), bet mēs joprojām gaidām, lai redzētu, vai ienāk citas paketes, jo tās, iespējams, kaut kur ir aizkavējušās tīklā. Šeit ir TCP/IP statusa diagramma:
Operētājsistēma Windows šajā stāvoklī saglabās savienojumu 240 sekundes (kā iestatīts, iestatot [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay]). Sistēmai Windows ir ierobežojums, cik ātri var atvērt jaunu ligzdu, tāpēc, ja beidzas savienojumu pūli, var tikt parādīta šāda kļūda:
Nevar izveidot savienojumu ar attālo serveri
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted. Meklējot to Google, jūs saņemsiet dažus sliktus padomus par savienojuma taimauta samazināšanu. Faktiski, pareizi darbojoties serverī ar HttpClient vai līdzīgi izveidotu lietojumprogrammu, taimauta samazināšana var izraisīt citas nelabvēlīgas sekas. Mums ir jāsaprot, ko nozīmē "pareizi", un jāatrisina pamatproblēma, nevis jāstrādā ar mašīnas līmeņa mainīgajiem.
Labošana
Ja mēs kopīgojam HttpClient instanci, mēs varam samazināt kontaktligzdu atkritumus, tos atkārtoti izmantojot:
Ņemiet vērā, ka visai lietojumprogrammai mums ir tikai viena koplietojama instance. HttpClient joprojām darbojas tāpat kā iepriekš (faktiski nedaudz ātrāk ligzdas atkārtotas izmantošanas dēļ). Netstat tagad rāda tikai:
TCP 10.211.55.6:12254 waws-prod-bay-017:http IZVEIDOTS Ražošanas scenārijā mans ligzdu skaits vidēji ir aptuveni 4000 un maksimums pārsniedz 5000, efektīvi saspiežot serverī pieejamos resursus, izraisot pakalpojuma avāriju. Pēc izmaiņu ieviešanas izmantoto kontaktligzdu skaits samazinājās no vidēji vairāk nekā 4000 līdz pastāvīgi mazāk nekā 400, parasti ap 100.
Šī ir daļa no mūsu uzraudzības rīka diagrammas, kas parāda, kas notiek pēc tam, kad mēs izvietojam ierobežotu skaitu labojumu pierādījumu atlasītam skaitam mikropakalpojumu.
Tas bija dramatiski. Ja jums ir jebkāda veida slodze, jums jāpatur prātā šīs divas lietas:
Padariet savu HttpClient statisku. Neizmetiet un neiesaiņojiet savu lietojumu, ja vien nemeklējat konkrētu rīcību (piemēram, pakalpojuma neveiksmi). Http klients
Kopsavilkuma
Kontaktligzdas izsmelšanas problēma, ar kuru mēs cīnījāmies mēnešiem ilgi, ir pagājusi, un mūsu klientiem ir virtuāla parāde. Es nevaru novērtēt, cik neacīmredzama ir šī kļūda. Gadu gaitā mēs esam pieraduši strādāt ar ieviestiem objektiem, IDisposable, un daudzi pārveidošanas rīki, piemēram, R# un CodeRush, faktiski brīdina jūs, ja to nedarāt. Šajā gadījumā HttpClient iznīcināšana ir nepareiza pieeja. HttpClient ievieš IDisposable un veicina sliktu uzvedību ir žēl
Sākotnējā:Hipersaites pieteikšanās ir redzama.
|