Sledi povzetek težav pri implementaciji visokozmogljive komponente socketa; če morate obravnavati le tisoče sočasnih aplikacij, se lahko osredotočite na pisanje kode, vendar se morate soočiti z desettisoči ali desettisoči sočasnih aplikacij. Povzetek naslednjih vprašanj naj bi bil v veliko pomoč pri pisanju te prijave.
SocketAsyncEventArgs
Ta objekt je na voljo po .NET 2.0 sp1 in se predvsem uporablja za izvajanje visokozmogljive obdelave podatkov iz socketov (za podrobnejši uvod lahko obiščete MSDN). Ta objekt omogoča tri načine nastavitve medpomnilnikov za pošiljanje in prejemanje povezanih sendov: SetBuffer(Int32, Int32), SetBuffer(Byte(), Int32, Int32, BufferList, prva dva ne moreta sodelovati z zadnjimi ( MSDN pojasnjuje zakaj). Ko nastavite Buffer, naj bo to SetBuffer(Byte(), Int32, Int32) ali BufferList, ga poskušajte nastaviti le enkrat na instanco SocketAsyncEventArgs skozi celotno življenjsko dobo programa, saj je ta nastavitev lahko zelo zahtevna za vire. Priporočljivo je, da podatkovni medpomnilnik nastavite preko SetBuffer(Byte(), Int32, Int32) med gradnjo SocketAsyncEventArgs, nato pa uporabite SetBuffer(Int32, Int32) za njegovo obdelavo. Ko želite nastaviti BufferList, je najbolje, da ne spreminjate <byte>izvorne kode bajta[], na katero se sklicuje IList<ArraySegment>. Če se to spremeni, bo povzročilo, da se SocketAsyncEventArgs ponovno poveže medpomnilnik in vpliva na učinkovitost.
SocketAsyncEventArgs pool
Kot je bilo omenjeno zgoraj, poskušajte čim manj spreminjati medpomnilnik, na katerega se sklicuje SocketAsyncEventArgs, da bi dosegli ta cilj. Zato je potrebno zgraditi aplikacijski nabor SocketAsyncEventArgs in čim bolj inicializirati objekt SocketAsyncEventArgs na začetku programa. Poleg zmanjšanja nastanka SocketAsyncEventArgs lahko gradnja bazenov tudi močno prihrani pomnilnik. Glavni razlog je, da ne moreš vedeti, kako veliko je vsako sporočilo, seveda lahko sporočilo določiš največjo omejitev pred načrtovanjem in nato nastaviš medpomnilnik, ki ustreza SocketAsyncEventArgs. Vendar je to velika izguba pomnilnika, saj nimajo vsa sporočila največje dolžine. Dodelite ustrezno količino medpomnilnika za SocketAsyncEventArgs, zagotovite klice prek skupin in fleksibilno zapišite sporočila v enega ali več SocketAsyncEventArgs ali shranite več sporočil v en SocketAsyncEventArgs za obdelavo.
Vrsta
Vidim, da je veliko praks tako, da se niti odpirajo neposredno ali jih po prejemu podatkov vržejo v bazen niti, kar je zelo slabo, ker to ne nadzoruje bolje dela niti, vključno s čakanjem niti. S prilagojenimi nitmi + čakalnimi vrstami lahko nadzorujete, koliko niti je odgovornih za katero delo, in delo v vrsti bo obstajalo samo v vrsti; Ne bo veliko niti ali veliko število čakalnih linij, kar bi povzročilo izgubo virov operacijskega sistema zaradi razporejanja niti.
Zamujena konsolidacija podatkov
Prenos podatkov z zamujenim združevanjem je način reševanja problema prekomernih omrežnih vhodno-vhodnih operacij, ki se ne uporablja v mnogih primerih, je pa pogost na strežnikih za igre. Nekdo mi je že postavil vprašanje: če je v sceni 400 uporabnikov, bo sprememba okolja vsakega uporabnika povedala ostalim. Če združeni podatki niso uporabljeni, bo nastala zelo zahtevna operacija omrežnega IO, kar je za IO sistem številčenja operacij težko prenašati. Zato je potrebno podatke združevati in pošiljati v ustreznem zamiku za trenutno aplikacijo. |