Za posledný týždeň som sa pustil do vývoja softvéru skúmaním konceptu virtuálnych aktérov. Nakoniec som sa pozrel na dva rôzne frameworky: Dapr a Orleans.
Oba projekty sú veľmi stručné s množstvom zaujímavých prípadov použitia. Obe používajú myšlienku "virtuálnych" aktérov. Virtuálny aktér je stavová a logická jednotka, ktorá:
- Môže byť jednoznačne identifikovaný podľa ID
- Je jednovláknová
- Môže byť v pamäti alebo perzistentný – jeho životný cyklus je riadený rámcom
Veľmi sa mi páči myšlienka virtuálnych aktérov a považujem ich za veľmi užitočné pri skúmaní budovania škálovateľných a spoľahlivých nástrojov na zvládanie zložitých pracovných tokov. Ak je každá úloha jednovláknovým virtuálnym účastníkom, problém pretekových podmienok zmizne.
Keďže Orleans a Dapr sú oba projekty Microsoftu, predstavujem si deň v štýle Western Story v Microsoftovej jedálni.
Orleans
Začal som s Orleans, pretože som ho už nejaký čas sledoval po tom, čo som videl niekoľko videí o ňom na YouTube. Začalo to naozaj zle, pretože som si myslel, že budem používať 4.x verziu všetkých ich NuGet balíkov. Avšak absolútne žiadna ich dokumentácia nefunguje s balíkom 4.x. Nakoniec som použil verziu 3.6.2.
Obilniny / Štát / Časovače
Vytvoriť zrno, ktoré sleduje svoj vlastný stav a vykonáva akcie, je veľmi jednoduché. Dokonca som dokázal sledovať dokumentáciu o perzistencii zrna a vytvoriť si vlastnú CosmosDB (SQL API) implementáciu IGrainStorage.
Pripomenutia
Pripomienky sa tiež ľahko nastavujú. Až kým som sa nepokúsil nastaviť reálnu perzistenciu pre nich. V tomto bode môjho výskumu sa snažím udržiavať všetko upratané a ukladať do ComsosDB. Bohužiaľ, balík Orleans na perzistenciu mi vôbec nefunguje. Nakoniec som musel prejsť na balík AzureStorage. Teraz sú moje dáta polovicu v SQL API účte a polovicu v table API účte.
Prúdy
Tam som to nedopadol dobre. V Orleans sú toky identifikované pomocou GUID a voliteľného menného priestoru. Som si istý, že existuje dobrý dôvod, prečo musia byť streamy identifikované GUID, ale wow, to je nepraktické.
Som veľmi frustrovaný zo streamov, pretože som ich dokázal ľahko vytvoriť, ale keď zastavím, reštartujem projekt a spustím novú udalosť, všetko spadne.
Nasleduje veľmi cenná informácia, pretože mi trvalo 8 hodín, kým som reverzne analyzoval Orleanský kód, aby som na to prišiel:
Keď je zrno odberateľom prúdu, zrno musí zavolať ResumeAsync na predplatné v metóde OnActivateAsync, inak dôjde k pádu s nerozpoznanou chybou.
Mal som tiež problém s rovnakým predplatným, takže som použil kód na vymazanie všetkých odberateľov obilia a potom som ho znovu vytvoril:
Ďalšie Orleans Catchy / Tipy
Streams dobre funguje s Azure Event Hubs (cez AddEventHubStreams).
Nepoužívajte / ani iné špeciálne znaky v názve Grain v CosmosDB SQL API!
Orleanský záver
Mám rád Orleans a myslím, že má potenciál. Avšak má veľmi strmú krivku učenia. Kvôli môjmu dlhodobému boju so streamovaním nemám čas študovať, ako fungujú klastre/nasadenia.
Dapr
Dapr som našiel hľadaním alternatív k Orleans. Je trochu zvláštne, že je to zároveň projekt sponzorovaný Microsoftom. Možno sú tu, aby zvolili prístup prežitia najsilnejšich. Ak áno, myslím, že Dapr bude preživší.
Po prvé, dizajn Dapr založený na REST/gRPC umožňuje implementovať aktérov v ľubovoľnom programovacom jazyku. Tiež som zistil, že je triviálne spúšťať všetko (účastníkov, stavy, časovače, pripomienky, udalosti) na jednej inštancii Redis. Navyše mi trvalo asi tretinu času, kým som začal používať Dapr. Taký rýchly štart je vďaka vynikajúcej dokumentácii Dapr.
Herci / Časovače / Pripomienky
Práve som povedal, že dokumentácia od Dapr je skvelá? No, je všade, okrem príkladov v JavaScripte. Väčšinu času trávim na Dapr, snažiac sa prísť na to, ako volať metódy na hercov. Kód pre vzorku Dapr Javascriptu je nasledovný:
Toto je zjavne zastarané. Musel som stráviť veľa času tým, že som tieto tri riadky presviedčal cez Dapr testovacie/ukážkové kódové skúmanie
Príklady kódu pre getting/setting state majú podobné problémy, tak som pre ne vytvoril GitHub issue.
Okrem týchto drobných problémov je príprava hercov hračka.
Nastavovanie časovačov a pripomienok pre moju sadlinu je tiež veľmi jednoduché.
Štát
Podarilo sa mi veľmi jednoducho nastaviť Dapr tak, aby pretrvával s Postgresom.
Jedna vec, ktorú som si všimol, je, že môžu byť problémy so škálovateľnosťou spôsobu ukladania pripomienok. Dapr ukladá všetky upozornenia pre konkrétny typ účastníka v jednom JSON poli. Čo sa stane, ak má niekto veľa pripomienok?
Ďalšie Dapr tipy / tipy
Jedna vec, ktorú som si všimol pri prehliadaní kódu JavaScript SDK, je, že v kóde nie je takmer nič komentárov. To robí takmer nemožným niečo zistiť. Napríklad v metóde adOrUpdateState správcu stavu existuje tretí parameter nazývaný updateValueFactory. Ak v kóde nie sú žiadne komentáre, je takmer nemožné zistiť, na čo callback slúži.
Tiež si nie som istý, ako veľmi sa mi páči príkaz "dapr init", ktorý sa mi snaží nastaviť a spustiť kontajner Redis. Čo ak už mám redisovú nádobu? Čo ak chcem použiť postgres namiesto toho? Nemôžem nájsť dokumentáciu, ktorá by vysvetľovala, ako zmeniť funkciu dapr init.
Poznámka pre každého, kto má problém používať pubsub. Musíte použiť "dapr run" na prevádzku svojho vydavateľa aj predplatiteľa:
Pre aktorov a pubsub je dôležité použiť parameter --app-port, aby dapr vedel, na ktorom porte vaša služba beží. pubsub udalosti a volania hercov sú posielané vašej službe z Dapr sidecaru cez HTTP hovory, takže musí vedieť, kam ich poslať:
Testoval som malý Dapr self-hosted "cluster" tak, že som spustil svoju pubsub subscriber inštanciu na dvoch rôznych počítačoch v mojej domácej sieti. Proste to fungovalo!
Záver Dapr
Ak chcete vedieť viac o distribuovaných aplikáciách alebo virtuálnych aktéroch, odporúčam začať s Dapr. Orleans bol pôvodný priekopník, zatiaľ čo Dapr bol reboot, ktorý posunul veci na vyššiu úroveň.
Pôvodný odkaz:Prihlásenie na hypertextový odkaz je viditeľné.
|