Qëllimi i sistemit
Mbështetje për aksesin e largët në skedarët në kompjuterët në rrjet. Sistemi "virtualisht" mbështet të gjitha operacionet kryesore të skedarëve (krijimi, fshirja, leximi, shkrimi etj.) përmes shkëmbimit të transaksioneve (mesazheve) përmes protokollit TCP.
Fushat e aplikimit
Funksionaliteti i sistemit është efikas në rastet e mëposhtme:
- në aplikacionet nativ për pajisje mobile dhe embedded (smartphone, sisteme të menaxhimit të bordit etj.), që kërkojnë qasje të shpejtë në skedarët në serverat e largët në kushte të prirjes për ndërprerje të mundshme të lidhjes (duke u shkëputur në offline);
- në TDB të ngarkuara, nëse përpunimi i kërkesave bëhet në servera të njëjtë, ndërsa ruajtja e të dhënave - në të tjerë;
- në rrjetet korporate të shpërndara për mbledhjen dhe përpunimin e informacioneve, që kërkojnë shpejtësi të lartë në shkëmbimin e të dhënave, rezervimin dhe besueshmërinë;
- në sisteme komplekse me arkitekturë mikroshërbimi, ku vonesat në shkëmbimin e informacionit midis moduleve kanë një rëndësi kritikisht të madhe.
Struktura
Sistemi Cage (ka një implementim - beta-version në Python 3.7 në sistemin operativ Windows) përfshin dy pjesë kryesore:
- Cageserver â programi i serverit tĂ« skedarĂ«ve (paketa e funksioneve) qĂ« aktivizohet nĂ« kompjuterĂ«t nĂ« rrjet, tĂ« cilĂ«ve u nevojitet qasje e largĂ«t nĂ« skedarĂ«;
- klasa Cage me një bibliotekë metodash për softuerin klient, që thjeshton kodimin e ndërveprimit me serverët.
Përdorimi i sistemit në anën e klientëve
Metodat e klasës Cage zëvendësojnë operacionet "rutinale" të zakonshme të sistemit të skedarëve: kreu, hapja, mbyllja, fshirja e skedarëve, si dhe leximin/shkrimin e të dhënave në format binar (me përcaktimin e pozicionit dhe madhësisë së të dhënave). Konceptualisht këto metoda janë të afërta me funksionet e skedarëve të gjuhës C, ku apertura/mbyllja e skedarëve bëhet "në kanalet" e hyrjes dhe daljes.
Me fjalë të tjera, programuesi punon jo me metodat e objekteve "skedare" (klasa _io në Python), por me metodat e klasës Cage.
Kur krijohet një instancë e objektit Cage, ai vendos lidhjen fillestare me serverin (ose me disa serverë), kalon autorizimin me Id e klientit dhe merr një konfirmim me numrin e portit të dedikuar për të kryer të gjitha operacionet e skedarëve. Kur objekti Cage fshihet, ai i jep serverit një urdhër për të ndërprerë lidhjen dhe për të mbyllur skedarët. Ndërprerja e lidhjes mund të inicirohet edhe nga vetë serverët.
Sistemi rrit shpejtësinë e leximit/shkrimit duke u bazuar në buffers të fragmenteve të skedarëve që përdoren shpesh nga programet klient në memorie (buffer) RAM.
Programi klient mund të përdorë çdo numër objektesh Cage me cilësime të ndryshme (kapaciteti i memories bufer, madhësia e bllokut gjatë shkëmbimit me serverin etj.).
Një objekt Cage mund të shkëmbejë të dhëna me disa skedarë në disa serverë. Parametrat për lidhjen (adresem IP ose DNS serveri, porta kryesore për autorizimin, rruga dhe emri i skedarit) vendosen gjatë krijimit të objektit.
Duke qenĂ« se çdo objekt Cage mund tĂ« punojĂ« gjithashtu me shumĂ« skedarĂ«, pĂ«r buferizimin pĂ«rdoret njĂ« hapĂ«sirĂ« e pĂ«rbashkĂ«t e memories. MadhĂ«sia e caches â numri i faqeve dhe madhĂ«sia e tyre, caktohet dinamikisht gjatĂ« krijimit tĂ« objektit Cage. PĂ«r shembull, njĂ« cache prej 1 GB Ă«shtĂ« 1000 faqe me nga 1 MB, ose 10,000 faqe me nga 100 KB, ose 1 milion faqe me nga 1 KB. Zgjedhja e madhĂ«sisĂ« dhe numrit tĂ« faqeve Ă«shtĂ« njĂ« detyrĂ« specifike pĂ«r çdo rast aplikativ.
Mund të përdoren njëkohësisht disa objekte Cage, për të përcaktuar cilësime të ndryshme të memories bufer në varësi të karakteristikave të aksesit në informacion në skedarë të ndryshëm. Si bazë përdoret algoritmi më i thjeshtë i buferizimit: pas shterimit të sasisë së caktuar të memories, faqet e reja zëvendësojnë ato të vjetra sipas parimit të përjashtimit me numrin minimal të aksesimeve. Buferizimi është veçanërisht i efektshëm në rastin e aksesit të pandërprerë (në kuptimin statistik) nga ana e ndryshme e skedarëve dhe, nga ana tjetër, e fragmenteve të çdo skedari.
Klasa Cage mbĂ«shtet hyrjen/daljen jo vetĂ«m pĂ«r adresat e tĂ« dhĂ«nave (me pĂ«rcaktimin e pozicionit dhe gjatĂ«si tĂ« masĂ«s, "duke zĂ«vendĂ«suar" operacionet e sistemit tĂ« skedarĂ«ve), por edhe nĂ« njĂ« nivel mĂ« tĂ« ulĂ«t, "fisik" â pĂ«rmes numrave tĂ« faqeve nĂ« memorien bufer.
PĂ«r objektet Cage mbĂ«shtetet funksioni origjinal "hibernimi" («sna») â ato mund tĂ« «mbĂ«shtillen» (p.sh., nĂ« rastin e ndĂ«rprerjes sĂ« lidhjes me serverat, ose kur aplikacioni ndalet etj.) nĂ« njĂ« skedar dump lokal nga ana e klientit dhe shpejt tĂ« rikuperohen nga ky skedar (pas rinovimit tĂ« lidhjes, kur aplikacioni radohidhet). Kjo ofron mundĂ«sinĂ« e reduktimit tĂ« rĂ«ndĂ«sishĂ«m tĂ« trafikĂ«ve kur aktivizohet puna e programit tĂ« klientit pas njĂ« pushimi tĂ« pĂ«rkohshĂ«m «offline», duke qenĂ« se segmentet e shpeshta tĂ« skedarĂ«ve tashmĂ« do tĂ« jenĂ« nĂ« cache.
Cage â janĂ« rreth 3600 rreshta kodi.
Principet e ndërtimit të serverëve
Skedar-serverĂ«t Cageserver mund tĂ« nisen me njĂ« numĂ«r tĂ« rastĂ«sishĂ«m portesh, njĂ« prej tĂ« cilave («nĂ«ntë»), pĂ«rdoret vetĂ«m pĂ«r autorizimin e tĂ« gjithĂ« klientĂ«ve, ndĂ«rsa tĂ« tjerat â pĂ«r shkĂ«mbimin e tĂ« dhĂ«nave. PĂ«r programin e serverit Cage nevojitet vetĂ«m Python. NĂ« tĂ« njĂ«jtĂ«n kohĂ«, kompjuteri me serverin e skedarĂ«ve mund tĂ« kryejĂ« çdo punĂ« tjetĂ«r.
Serveri nishet në fillim si një grup dy procesesh kryesore:
- «Lidhjet» â procesi pĂ«r tĂ« kryer operacione lidhjeje me klientĂ«t dhe pĂ«r ta ndĂ«rprerĂ« atĂ« me iniciativĂ«n e serverit;
- «Operacione» â procesi pĂ«r tĂ« kryer detyra (operacione) tĂ« klientĂ«ve pĂ«r punĂ«n me skedarĂ«t, si dhe pĂ«r tĂ« mbyllur seancat e lidhjes sipas komandave tĂ« klientĂ«ve.
Të dy proceset nuk janë të sinkronizuara dhe organizohen si cikle të pafundme të pranimit dhe dërgimit të mesazheve mbi bazën e radhëve multi-proces, objekteve proxy, bllokimeve dhe socket-eve.
Procesi «Lidhjes» ndan një port për pranimin dhe dërgimin e të dhënave për secilin klient. Numri i porteve përcaktohet në fillim të serverit. Përputhshmëria midis porteve dhe klientëve ruhet në memorien proxy të ndarë ndërmjet proceseve.
Procesi «Operacione» mbështet ndarjen e burimeve skedare, kurse disa klientë të ndryshëm mund të lexojnë së bashku (kvasiparalelisht, pasi qasja menaxhohet nga bllokimet) të dhëna nga një skedar, nëse kjo është lejuar gjatë hapjes fillestare nga «klienti» i parë.
Punimi i komandave për krijimin/zhbllokimin/hapjen/mbylljen e skedarëve server kryhet në vetë procesin e «Operacioneve» në mënyrë të rreptë, duke përdorur sistemin e skedarëve të OS-të së serverit.
Për të përshpejtuar leximin/shkrimin, këto operacione kryhen në thread-e që krijohen nga procesi "Operacione". Numri i thread-eve është zakonisht i barabartë me numrin e skedarëve të hapur. Detyrat për lexim/shkrim nga klientët dorëzohen në një radhë të përbashkët dhe thread-i i parë që çlirohet merr detyrën nga fillimi i saj. Logjika e veçantë lejon përjashtimin e operacioneve të rimarrjes së të dhënave në memorien e përhershme të serverit.
Procesi "Operacione" ndjek aktivitetin e klientëve dhe ndalon shërbimin e tyre si sipas urdhrave të tyre, ashtu edhe kur kalon koha e pritjes për pasivitet.
Për të siguruar besueshmërinë, Cageserver mban ditarë të të gjitha transaksioneve. Një ditar i përbashkët përmban kopje të mesazheve nga klientët me detyrat për krijimin/ hapjen/ rinovimin/ fshirjen e skedarëve. Për çdo skedar në punë krijohet një ditar i veçantë, në të cilin regjistrohen kopjet e mesazheve me detyrat për lexim dhe shkrim të të dhënave në këtë skedar, si dhe masat e të dhënave që janë shkruar (të reja) dhe masat e të dhënave që janë shkatërruar gjatë rimarrjes (shkrimit të të dhënave të reja "në sipër të" atyre të vjetra).
Këta ditarë ofrojnë mundësinë për restaurimin e ndryshimeve të reja në kopje rezervë si dhe për "rikthimin" nga përmbajtja aktuale në një moment të caktuar në të kaluarën.
Cageserver ka rreth 3100 rreshta kodi.

Fillimi i programit të serverit të skedarëve Cageserver
Gjithashtu, gjatë fillimit në dialog duhet të përcaktohet:
â porta kryesore pĂ«r autorizim;
â numri i porteve pĂ«r shkĂ«mbimin e transaksioneve me klientĂ«t e autorizuar (nga 1 dhe mĂ« shumĂ«, grupi numrave fillon nga numri pas numrit kryesor tĂ« portĂ«s).
Përdorimi i klasës Cage
class cage.Cage( cage_name=», pagesize=0, numpages=0, maxstrlen=0, server_ip={}, wait=0, awake=False, cache_file=»» )
Nga kjo klasë krijohen objekte, të cilat kryejnë ndërveprimin me serverët e skedarëve dhe përmbajnë memorien bufer.
Parametrat
- cage_name(str) â emri i kushtĂ«zuar i objektit, i cili pĂ«rdoret gjatĂ« identifikimit tĂ« klientĂ«ve nĂ« anĂ«n e serverit
- pagesize(int) â madhĂ«sia e njĂ« faqe tĂ« memories bufer (nĂ« byte)
- numpages(int) â numri i faqeve tĂ« memories bufer
- maxstrlen(int) â maksimalja e gjatĂ«si sĂ« vargut nĂ« operacionet e shkrimit dhe leximit
- server_ip(dict) â njĂ« fjalor me adresat e pĂ«rdorura serverĂ«sh, ku çelĂ«si Ă«shtĂ« emri kushtor i serverit (id e serverit brenda aplikacionit), dhe vlera Ă«shtĂ« njĂ« string me adresĂ«n: âip address:portâ ose âDNS:portâ (pĂ«rputhja e emrave me adresat reale Ă«shtĂ« pĂ«rkohshme, mund tĂ« ndryshohet)
- prisni(int) â koha e pritjes pĂ«r pĂ«rgjigje nga serveri gjatĂ« marrjes sĂ« porteve (nĂ« sek.)
- zgjohem(boolean) â flamuri i mĂ«nyrĂ«s sĂ« krijimit tĂ« objektit (False â nĂ«se krijohet njĂ« objekt i ri, E vĂ«rtetĂ« â nĂ«se objekti krijohet nga njĂ« âhibernuarâ mĂ« parĂ« â duke aplikuar operacionin âhibernimiâ, pĂ«r nga e drejta False)
- cache_file(str) â emri i skedarit pĂ«r hibernimin
Metodat
Kapsula.file_create( server, rruga ) â krijo njĂ« skedar tĂ« ri
Kapsula.file_rename( server, rruga, emri_i_ridhen ) â ndrysho emrin e skedarit
Kapsula.file_remove( server, rruga) â fshi skedarin
Kapsula.open( server, rruga, mod ) â hap skedarin
Kthen fchannel numri i kanalit. Parametri mod â ky Ă«shtĂ« regjimi i hapjes sĂ« skedarit: âwmâ â monopol (lexim/shkrim), ârsâ â vetĂ«m leximi, dhe e ndarĂ« vetĂ«m pĂ«r lexim nga klientĂ«t e tjerĂ«, âwsâ â lexim/shkrim, dhe e ndarĂ« vetĂ«m pĂ«r lexim nga klientĂ«t e tjerĂ«.
Kapsula.close (fchannel) â mbyll skedarin
Kapsula.write (fchannel, fillim, tĂ« dhĂ«na ) â shkruaj njĂ« varg byte nĂ« skedar
Kapsula.read (fchannel, fillim, len_data ) â lexoj njĂ« varg byte nga skedari
Kapsula.put_pages ( fchannel ) â âshtynâ nga buffer nĂ« server tĂ« gjitha faqet e kanalit tĂ« specifikuar, qĂ« janĂ« modifikuar. PĂ«rdoret nĂ« pikat e algoritmit, kur duhet tĂ« jemi tĂ« sigurt se tĂ« gjitha operacionet nĂ« kanal janĂ« ruajtur fizikisht nĂ« skedar nĂ« server.
Kapsula.push_all () â âshtynâ nga buffer nĂ« server tĂ« gjitha faqet e tĂ« gjitha kanaleve pĂ«r instancĂ«n e klasĂ«s Cage, qĂ« janĂ« modifikuar. PĂ«rdoret kur duhet tĂ« jemi tĂ« sigurt se tĂ« gjitha operacionet nĂ« tĂ« gjitha kanalet janĂ« ruajtur nĂ« server.
Burimi: habr.com
