BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

Įvadas į paskirstytą tarpinę atmintį Microsoft Velocity – 3 dalis

Parašė Sergejus | 2009-09-27 22:17

Antroje įvado dalyje aš aprašiau Microsoft Velocity diegimą ir konfigūravimą. Šiandien paskutinė straipsnių ciklo dalis, kurioje norėčiau trumpai aprašyti pagrindinius Velocity API metodus. Šiame pavyzdyje aš naudosiu konsolinę programą, kuri kešuos iš vienos lentelės gaunamus duomenis.

Pradėsime nuo konfigūracijos failo aprašymo. Darant prielaidą, kad Microsoft Distributed Cache yra suinstaliuotas lokaliame kompiuteryje ir naudoja prievadą (portą) pagal nutylėjimą, App.config failas atrodys taip:

velocity6

Norėdami pasinaudoti Velocity iš kodo, pirma reikia įtraukti dvi nuorodas į CacheBaseLibrary ir ClientLibrary bibliotekas (randasi Microsoft Distributed Cache kataloge). Tarpinės atminties panaudojimą geriausia parodyti aprašant servisų klasę:

velocity7

Kaip matyti, metode GetLanguages() pirma bandoma kreiptis į tarpinę atmintį ir jeigu joje nieko nėra – vykdoma užklausą į duomenų bazę. Kadangi tarpinė atmintis turi būti atnaujinama keičiant egzistuojančius arba įterpiant naujus duomenis, metode SaveLanguage() sukešuotas elementas išvalomas.

Norėdami patikrinti tarpinės atminties veikimą, parašykime paprasčiausią testą:

velocity8

Testo metu 10 kartų kreipiamasi į metodą GetLanguages(), bet Debug konsolėje matysime lygiai 1 select užklausą. Norėčiau atkreipti dėmesį į tai, kaip kuriamas tarpinės atminties objektas. Tai daroma GetDefaultCache() factory metodo pagalba. Norint gauti priėjimą ne prie numatytosios tarpinės atminties, bet prie norimo tarpinės atminties regiono – tereikia pasinaudoti metodu GetCache().

Štai ir viskas, ką norėjau aprašyti šiame straipsnių cikle. Iš asmeninės patirties galiu pasakyti, kad Microsoft Distributed Cache greitaveika šiuo metu tikrai yra gera, bet API jaučiasi dar nėra iki galo išbaigtas. Pavyzdžiui, nėra paprasto būdo patikrinti ar egzistuoja tarpinės atminties regionas nurodytu vardu. Kaip mane tikino Velocity komanda, su artimiausia versija toks metodas pasirodys. Nepaisant visų trūkumų, džiugu kad judama tinkama linkme ir jeigu jums prisireiks paskirstytos tarpinės atminties – tikrai siūlyčiau išbandyti Microsoft Velocity.

Rodyk draugams

Lietuvos .NET vartotojų grupės susitikimo medžiaga

Parašė Sergejus | 2009-09-22 20:13

DotNetGroup.lt Media skiltyje patalpintos visos paskutinio Lietuvos .NET varotojų grupės susitikimo skaidrės bei demo kodas.

Rodyk draugams

Įvadas į paskirstytą tarpinę atmintį Microsoft Velocity – 2 dalis

Parašė Sergejus | 2009-09-20 13:24

Pirmoje įvado dalyje aš trumpai aprašiau Microsoft Velocity paskirstytos tarpinės atminties pagrindus, apžvelgiau pagrindines sąvokas, architektūrą bei veikimo principus. Šiandien norėčiau parodyti kaip ją įdiegti, sukonfigūruoti bei paruošti darbui.

Šio straipsnio rašymo metu naujausia versija yra CTP3, kurią galima parsisiųsti iš čia. Greitu metu turėtų pasirodyti atnaujinta versija – CTP4. Microsoft Velocity diegimas yra pakankamai paprastas, bet ypatingą dėmesį reikia atkreipti į šį konfigūracijos langą:

velocity3 

Kaip matyti, šiame lange reikia pasirinkti kur bus saugomi mūsų paskirstytos tarpinės atminties nustatymai: bendrai prieinamame kataloge (shared folder) arba duomenų bazėje, kiek blokinio (klasterio) mazgų numatoma turėti, kokius prievadus (portus) naudosime ir kokį didžiausią duomenų kiekį leisti laikyti tarpinėje atmintyje. Šiuo atveju nustatymų saugojimui aš pasirinksiu išorinę duomenų bazę bei paliksiu kitus nustatymus pagal nutylėjimą:

velocity4

Sėkmingai įdiegus Microsoft Velocity jūsų darbastalyje atsiras PowerShell nuoroda: Administration Tool - Microsoft Distributed Cache. Ją reikia būtinai leisti administratoriaus teisėmis (Run as Administrator), kitaip gausite klaidą. Pirmo paleidimo metu pamatysite klausimą „Ar norite leisti naudotis nepasirašytomis (unsigned) bibliotekomis“. Atsakymas turėtų būti teigimas – Allow Always. Taip pat prieš pradedant naudotis, PowerShell komandinėje eilutėje jums reikės įvykdyti komandą Use-CacheCluster. Štai ir viskas, Microsoft Velocity paruošta darbui!

velocity5

Administruojant Microsoft Distributed Cache patartina atsiminti porą pagrindinių komandų:

  • New-Cache – sukuria naują vardinę tarpinę atmintį
  • Get-Cache – parodo visas sukurtas tarpines atmintis ir jų regionus
  • Get-CacheStatistics –CacheName X – parodo tarpinės atminties vardu X panaudojimo statistiką
  • Stop-CacheCluster, Start-CacheCluster, Restart-CacheCluster – sustabdo, startuoja ir perkrauna kešavimo blokinį

Tiek šiam kartui iš Microsoft Velocity diegimo ir konfigūravimo, trečioje dalyje aptarsiu Velocity API panaudojimą iš kodo.

Rodyk draugams

Su programuotojų diena!

Parašė Sergejus | 2009-09-13 10:37

Paaiškinimas kodėl prgramuotojų diena švenčiama būtent šiandien (rugsėjo 13-ą dieną):

Programuotojų diena švenčiama 256-ąją metų dieną. 256 - skaičius, gaunamas 2 pakėlus 8-uoju laipsniu. Tokį skaičių reikšmių galima pateikti viename baite. Baitas yra dvejetainis skaičius, sudarytas iš 8 bitų. Bitas - mažiausias informacijos kiekio vienetas kompiuteryje.

Šią dieną įvairių šalių programuotojai rengia vakarėlius, krečia kompiuterinius pokštus, rašo juokingas programas, varžosi kompiuteriniais žaidimais, dirba senais kompiuteriais ir kt. Programuotojų diena dažniausiai būna rugsėjo 13 dieną, tik keliamaisiais metais (kai vasario mėnuo turi 29 d.) - rugsėjo 12 d.

paimta iš Day.lt

Rodyk draugams

Naujasis mano tinklaraštis anglų kalba - sergejus.com

Parašė Sergejus | 2009-09-09 19:31

Įvyko! Šiandien startuoja mano naujasis tinklaraštis anglų kalba - http://sergejus.com. Noriu iš karto pažymėti, kad „Sergejus apie .NET” ir toliau lieka pagrindiniu mano tinklaraščiu. Šiuo metu dar nesu apsisprendęs, koks turinys bus publikuojamas čia, koks eis į anglišką, o koks į abu. Jeigu turite kokių pamąstymų dėl turinio paskirstymo - labai laukiu komentarų!

Rodyk draugams

Įvadas į paskirstytą tarpinę atmintį Microsoft Velocity – 1 dalis

Parašė Sergejus | 2009-09-07 23:36

Taip jau atsitiko, kad darbe man prisireikė panaudoti bendrą tarpinę atmintį (kešą) iš karto kelioms aplikacijoms: ASP.NET aplikacijai, WCF servisams, Windows servisui ir net konsolinei aplikacijai. Prasidėjo nuo to, kad pradžioje kešavimas buvo naudojamas tik ASP.NET pusėje (WebCache). Vėliau buvo kuriamos papildomos aplikacijos bei servisai ir galiausiai atsirado poreikis panaudoti tarpinę atmintį, kuri būtų pasiekiama iš bet kokio tipo aplikacijos.

Jau kurį laiką CTP stadijoje egzistuoja Microsoft paskirstyta tarpinė atmintis Velocity (galutinis pavadinimas tikriausiai bus Microsoft Distributed Cache). Šiandien aš norėčiau padaryti trumpą įvadą į Microsoft Velocity bei apžvelgti pagrindines sąvokas.

Pradėsime nuo pradžių - kas yra paskirstyta tarpinė atmintis? Manau geriausiai į šį klausimą atsako šis paveiksliukas:

Kaip matyti, paskirstyta tarpinė atmintis pasižymi keliomis svarbiomis charakteristikomis:

  • ji yra pasiekiama aplikacijoms esančioms tiek tame pačiame kompiuteryje, tiek skirtinguose;
  • iš programavimo pusės ji atrodo kaip unifikuota, neriboto dydžio tarpinė saugykla;
  • visi sukešuoti duomenys yra saugomi viename arba keliuose serveriuose (blokinyje), sugedus vienam iš kurių visa apkrova bus automatiškai paskirstyta tarp likusių serverių.

Akivaizdu, kad tarpinės atminties blokinio valdymui reikalinga atskira programinė įranga. Norėčiau pagirti Velocity komandą už tikrai teisingą sprendimą naudoti PowerShell šiam uždaviniui. Iš PowerShell komandinės eilutės galima perkrauti tarpinės atminties blokinį arba atskirą jo serverį, galima pasižiūrėti egzistuojančias tarpines atmintis, sukurti naują arba tiesiog gauti jos naudojimo statistiką.

Išnagrinėję bendrus paskirstytos tarpinės atminties aspektus, laikas aptarti Velocity komponentus bei pagrindines sąvokas: kešavimo serverį, vardinę tarpinę atmintį bei regionus.

Kaip jau buvau užsiminęs, Velocity paskirstytą tarpinę atmintį sudaro vienas arba daugiau kešavimo serverių, apjungtų į blokinį. Tarpinės atminties valdymas yra atliekamas viso blokinio mastu. Kadangi tuo pačiu tarpinės atminties blokiniu gali naudotis skirtingos, tarpusavyje nesusijusios aplikacijos, egzistuoja taip vadinamos vardinės tarpinės atmintis (Named Cache). Pagal nutylėjimą visada prieinama numatytoji (default) tarpinė atmintis, bet esant  poreikiui galima sukurti vardines (pavyzdyje, vardinė tarpinė atmintis „Klientai”). Verta pabrėžti, kad kiekviena vardinė tarpinė atmintis yra paskirstyta tarp visų blokinio serverių.

Sukešuoti objektai gali būti saugomi ne tik vardinėje tarpinėje atmintyje, bet ir regione. Kiekvienoje vardinėje tarpinėje atmintyje galima sukurti vieną arba daugiau regionų. Jie yra skirti loginiam sukešuotų objektų grupavimui ir pasižymi tokiomis savybėmis:

  • sukešuotų objektų paieška regionuose yra žymiai patogesnė nei vardinėje tarpinėje atmintyje;
  • sukešuoti objektai regionuose gali turėti žymes (tags);
  • vienam regionui priklausantys objektai fiziškai visada bus viename serveryje.

Apie Velocity veikimą galima dar rašyti ir rašyti, bet manau tiek pakanka, kad sudaryti bendrą vaizdą kas yra paskirstyta tarpinė atmintis ir iš kokių dalių susideda Microsoft Distributed Cache. Jeigu kas susidomėjo - patariu pasiskaityti MSDN dokumentaciją. Kitoje įvado dalyje aš pademonstruosiu Velocity diegimo ir konfigūravimo procesą.

Rodyk draugams

Lietuvos .NET vartotojų grupės susitikimas Vilniuje - bilietų stygius

Parašė Sergejus | 2009-09-03 12:57

Šį kartą įvyko dalykas, kurio visai nesitikėjau - 60 bilietų į .NET vartotojų grupės susitikimą Vilniuje buvo nušluoti per nepilną parą! Norėčiau paprašyti tų, kas negalės atvykti pranešti man, kad aš galėčiau atnaujinti laisvų vietų skaičių.

Šiam momentui aš pridėjau dar 5 vietas ir gali būti, pridėsiu dar paskutines 5 (viso 70).

Atnaujinta

Jeigu nespėjote užsiregistruoti į Lietuvos .NET varotojų grupės susitikimą - nebėda. Rašykite čia savo kontaktus ir kai tik kas atsisakys/negalės dalyvauti - imsime žmogų iš sąrašo

Rodyk draugams

Lietuvos .NET vartotojų grupės susitikimai

Parašė Sergejus | 2009-09-02 20:23

Pasiruoškite! Šį kartą jūsų laukia ypač įdomūs pristatymai iš greitai pasirodančių Visual Studio 2010 ir .NET Framework 4.0. Susitikimo metu mes šnekėsime apie: 
1. ASP.NET 4.0, ASP.NET MVC 2.0 ir ASP.NET AJAX 4.0 - Domantas Jovaišas
2. Visual Studio 2010 ir C# 4.0 - Sergejus Barinovas (MVP)
3. Entity Framework 4.0, WCF 4.0 ir ADO.NET Data Services 1.5 - Giedrius Banaitis 

Po oficialios dalies kaip visada mūsų laukia neoficiali dalis!

Vieta: Vilnius, MIF Informacinių technologijų centras, Šaltinių g. 1A
Data: 2009-09-17
Laikas: nuo 17:30
Registruotis

Vieta: Kaunas, Microsoft inovacijų centras (Technopolyje), 121 Europos prospektas
Data: 2009-09-15
Laikas: nuo 17:30
Registruotis

P.S. Kauno susitikimo dalyviai turės unikalią galimybę padirbėti su Microsoft Surface!

Rodyk draugams

LINQ to SQL audito biblioteka

Parašė Sergejus | 2009-09-01 00:17

Pastaruosius du metus aš labai intensyviai dirbu su LINQ to SQL. Per šį laikotarpį teko su juo daryti įvairiausius dalykus - nuo greitaveikos optimizavimo iki automatinio įrašų pakeitimų audito. Pastarąjį šiandien aptarsiu detaliau.

Viename iš projektų man reikėjo sekti visus vartotojų atliekamus veiksmus su duomenimis (pridėjimą, trynimą ir redagavimą) arba kitaip tariant - auditą (angl. Audit Trail). Kadangi visos operacijos su duomenų baze vyksta per duomenų kontekstą, užsinorėjo man specialiai tam skirtos LINQ to SQL audito bibliotekos. Geriausia ką pavyko rasti - Matto biblioteka DoddleAudit. Detaliau ją išanalizavus paaiškėjo, kad tai nevisai ko aš norėjau. Pirma Matto realizacija reikalauja, kad bet kuris duomenų kontekstas paveldėtų iš jo bazinės klasės, kas man buvo nepriimtina. Antra nebuvo galimybės iš karto įjungti visų esybių sekimo. Taigi nusprendžiau parašyti savo paprastą LINQ to SQL audito biblioteką.

Pagrindinis reikalavimas auditui iš mano pusės buvo nustatyti kuris naudotojas kokius veiksmus su duomenimis atliko, kokios laukų reikšmės buvo iki operacijos ir po jos. Tam aš apibrėžiau tokias C# klases:

Pagrindinė klasė yra AuditEntry, ji saugo informaciją apie tai kas atliko pakeitimus, kada, kokioje lentelėje ir kokiam tos lentelės įrašui (EntityTableKey). AuditField saugo senas ir naujas laukų reikšmes, o Action nurodo atliktą veiksmą.

Žemiau pateikiu šių klasių C# kodą:

Pasižiūrėję į klases AuditEntry ir AuditField jums gali kilti klausimas - kodėl aš naudoju POCO C# klases, bet ne LINQ to SQL klases. Aš norėjau šią biblioteką padaryti nepriklausoma nuo konkrečios duomenų bazės struktūros. Šiame pavyzdyje, aš naudosiu tokias AuditEntry ir AuditField atitinkančias duomenų bazės lenteles:

Paskutinė mums reikalinga klasė, o tiksliau atributas - IgnoreAudit:

Kaip ir seka iš pavadinimo, jeigu mums nereikia audituoti tam tikros LINQ to SQL esybės, užtenka partial klasėje tiesiog jai uždėti šį atributą.

Dabar mes jau turime pagrindą, laikas pereiti prie pačios audito logikos. Tam aš esu parašęs statinę klasę AuditExtensions su dviem praplėtimo metodais. Pagrindinis audito metodas yra AuditAndSaveChanges:

Trumpai aptarsiu kas yra daroma:

  • Duomenų kontekstas turi labai mums svarbų metodą GetChageSet. Jo pagalba galima gauti visas pridėtas, ištrintas ar redaguotas esybes.
  • Metodo viduje kiekvienam iš veiksmų aš kviečiu metodą Audit, kuris tiesiog pasiimą esybę ir pagal ja sukuria AuditEntry objektą.
  • Kadangi AuditAndSubmitChagnes bus kviečiamas SubmitChanges metode, mums papildomai reikalingas bazinis SubmitChanges metodas.
  • Delegatas transform atsakingas už AuditEntry ir AuditField transformaciją į konkrečias duomenų bazės esybes (mūsų atveju į AuditRecord ir AudifField atitinkamai.

Žemiau pateiksiu pagrindinį šios bibliotekos metodą Audit:

Kaip matote, metodas yra pakankamai ilgas ir sudėtingas. Viskas ką jis daro tai priklausomai nuo atlikto veiksmo (pridėjimo, trynimo, redagavimo) refleksijos pagalba pasiima senas ir naujas laukų reikšmes bei pagal tai sukuria AuditEntry objektus.

Šiame metode aš panaudojau keletą pagalbinių metodų iš SBToolkit projekto, tarp jų:

Štai ir viskas - biblioteka baigta! Bet kaip ja pasinaudoti? Pirma reikia sukurti esamam duomenų kontekstui partial klasę…

… ir perrašyti joje metodą SubmitChanges:

Štai taip, LINQ to SQL audito biblioteka savo rankomis. Čia aprašytą biblioteką galite parsisiųsti iš CodePlex kaip SBToolkit projekto dalį (projektai SBAudit ir SBAudit.LinqToSql).

Tikiuosi šis straipsnis jums bus naudingas ir laukiu komentarų / pasiūlymų dėl šios LINQ to SQL audito bibliotekos!

Rodyk draugams