Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 6079|Atsakyti: 4

[Šaltinis] Neteisingai naudojant "HttpClient", programinė įranga gali būti sugadinta

[Kopijuoti nuorodą]
Paskelbta 2022-05-14 17:11:56 | | | |
Aš naudoju HttpClient neteisingai metų metus, bet galiausiai košmaras atėjo. Mano svetainė buvo nestabili, o klientai buvo labai pikti, o paprastu pataisymu našumas labai pagerėjo ir nestabilumas pašalintas.



Tuo pačiu metu iš tikrųjų pagerinau savo programos našumą efektyviau naudodamas lizdus.

Mikropaslaugos gali būti sunkiai sprendžiamos problemos. Kadangi pridedama daugiau paslaugų ir suskaidomos monolitinės programos, paprastai atsiranda vis daugiau ryšio kelių tarp paslaugų. Yra daug ryšio galimybių, tačiau HTTP yra labai populiarus pasirinkimas. Jei mikropaslauga sukurta C# arba bet kuria .NET kalba, tikėtina, kad jau naudojate "HttpClient".


Problema slypi

Naudojant sakinys yra C# funkcija, kuri tvarko vienkartinius objektus. Kai blokas bus baigtas, vienkartinis objektas (šiuo atveju HttpClient) bus pašalintas ir pašalintas. Iškvieskite šalinimo metodą ir išvalykite visus naudojamus išteklius. Tai labai tipiškas .NET modelis, kurį naudojame viskam, pradedant duomenų baze ir baigiant srauto rašytuvu. Tiesą sakant, bet kuris objektas su išoriniu ištekliumi, kurį reikia išvalyti, naudoja tą IDisposable sąsają.

Ir jūs negalite būti kaltinami, kad norite suvynioti jį į naudojimą. Pirma, tai laikoma gera praktika. Tiesą sakant, oficiali "Microsoft" dokumentacija naudoja:


Apskritai, naudojant IDisposable objektą, jis turėtų būti deklaruojamas ir instanciuojamas naudojant teiginį.
Antra, visas kodas, kurį galbūt matėte...... "HttpClient" pradžioje bus nurodyta naudoti pareiškimo bloką, įskaitant naujausią dokumentaciją ASP.NET pačios svetainės. Tas pats sakoma straipsnyje internete.

Tačiau "HttpClient" yra kitoks. Nors ji įgyvendina IDisposable sąsają, iš tikrųjų tai yra bendras objektas. Tai reiškia, kad užkulisiuose jis yra sugrįžęs ir saugus siūlams. Turėtumėte bendrinti "HttpClient" egzempliorių per visą programos gyvavimo laiką, o ne kurti naują egzempliorių kiekvienam vykdymui. "HttpClient" pažiūrėkime, kodėl.

Įsitikinkite patys

Štai paprasta programa, skirta pademonstruoti "HttpClient":

Tai bus nukreipta į  http://aspnetmonsters.comAtidarykite 10 užklausų ir atlikite GET, mes tiesiog atspausdiname būsenos kodą, kad žinotume, kad jis veikia. Išvestis bus:

Palaukite, yra daugiau!

Visas darbas ir viskas tinka pasauliui. tik taip nėra. Jei ištrauksime "netstat" įrankį ir pažvelgsime į jį veikiančio įrenginio lizdo būseną, pamatysime:

C:\code\socket>NETSTAT.EXE
...
  Proto vietinis adresas Užsienio adreso valstybė
  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 ĮKURTA
...
Na, tai keista...... Programa išėjo, tačiau vis dar yra daugybė šių ryšių su "Azure" įrenginiu, kuriame yra "ASP.NET Monsters" svetainė. Jie yraTIME_WAITbūsena, o tai reiškia, kad ryšys buvo uždarytas iš vienos pusės (mūsų), tačiau vis dar laukiame, ar nepateks kitų paketų, nes jie galėjo kažkur vėluoti tinkle. Štai TCP/IP būsenos diagrama:



Sistemoje Windows bus prijungta 240 sekundžių (kaip nustatyta nustatant [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay]). "Windows" riboja, kaip greitai galite atidaryti naują lizdą, todėl, jei baigsis ryšių telkiniai, galite pamatyti tokią klaidą:

Nepavyko prisijungti prie nuotolinio serverio
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Ieškodami jo "Google" gausite blogų patarimų, kaip sumažinti ryšio skirtąjį laiką. Tiesą sakant, tinkamai paleidus serverį su "HttpClient" ar panašiai sukonstruota programa, skirtojo laiko sutrumpinimas gali sukelti kitų neigiamų pasekmių. Turime suprasti, ką reiškia "teisinga", ir išspręsti pagrindinę problemą, o ne dirbti su mašinos lygio kintamaisiais.

Pataisykite

Jei dalijamės "HttpClient" egzemplioriumi, galime sumažinti lizdų atliekas pakartotinai juos panaudodami:

Atminkite, kad visai programai turime tik vieną bendrinamą egzempliorių. HttpClient vis dar veikia kaip anksčiau (iš tikrųjų šiek tiek greičiau dėl lizdo pakartotinio naudojimo). "Netstat" dabar rodo tik:

TCP 10.211.55.6:12254 waws-prod-bay-017:http NUSTATYTA
Pagal gamybos scenarijų, mano lizdų skaičius vidutiniškai yra apie 4000 ir pikas virš 5000, veiksmingai išspaudžiant turimus išteklius serveryje, todėl paslauga sugenda. Įgyvendinus pakeitimą, naudojamų lizdų skaičius sumažėjo nuo vidutiniškai daugiau nei 4000 iki nuolat mažiau nei 400, paprastai apie 100.

Tai yra mūsų stebėjimo įrankio diagramos dalis, kurioje parodyta, kas nutinka įdiegus ribotą skaičių pataisymų tam tikram mikrotarnybų skaičiui.




Tai buvo dramatiška. Jei turite bet kokio tipo apkrovą, turite nepamiršti šių dviejų dalykų:

Padarykite savo HttpClient statinį.
Neišmeskite ir nesupakuokite naudojimo, nebent aiškiai ieškote konkretaus elgesio (pvz., dėl paslaugos gedimo). Http klientas


suvestinė

Lizdo išsekimo problema, su kuria kovojome mėnesius, nebėra, o mūsų klientai turi virtualų paradą. Negaliu nuvertinti, kokia neakivaizdi yra ši klaida. Bėgant metams, mes buvome įpratę dirbti su įdiegtais objektais, IDisposable, ir daugelis refactoring įrankių, tokių kaip R # ir CodeRush iš tikrųjų įspėja jus, jei ne. Šiuo atveju "HttpClient" šalinimas yra neteisingas būdas. HttpClient įgyvendina IDisposable ir skatina blogą elgesį yra gaila

Originalus:Hipersaito prisijungimas matomas.




Ankstesnis:"ASP.NET Core" talpina IIS apdorojamus ir neapdorojamus modelius
Kitą:"ASP.NET Core" (XV) naudoja "HttpClient" HTTP užklausoms siųsti
 Savininkas| Paskelbta 2022-05-14 17:25:22 |
TCP TIME_WAIT yra įprasta TCP protokolo operacija, o tai reiškia, kad praėjus paskutiniam FIN-ACK, klientas lauks, kol praeis dvigubas maksimalus tarnavimo laikas (MSL), kad nuotolinis TCP gautų patvirtinimą apie ryšio nutraukimo užklausą. Pagal numatytuosius nustatymus MSL yra 2 minutės. Galite būti TIME_WAIT iki 4 minučių, vadinamų dviem MSL.

https://docs.microsoft.com/en-us ... t-from-netstat.html
Paskelbta 2022-05-14 22:35:22 |
Išmokite mokytis
Paskelbta 2022-05-19 09:39:05 |
Visa tai kiniška, bet aš negaliu suprasti, kai ji sujungta į sakinius
 Savininkas| Paskelbta 2023-11-06 07:16:05 |
Bandymo
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com