Viimase nädala jooksul olen sukeldunud tarkvaraarendusse, uurides virtuaalsete näitlejate kontseptsiooni. Lõpuks uurisin kahte erinevat raamistikku: Dapr ja Orleans.
Mõlemad on väga lühikesed projektid, millel on palju huvitavaid kasutusjuhtumeid. Mõlemad kasutavad "virtuaalsete" näitlejate ideed. Virtuaalne aktor on oleku- ja loogikaüksus, mis:
- Seda saab unikaalselt tuvastada ID järgi
- See on ühe keermega
- Võib olla mälus või püsiv – selle elutsüklit haldab raamistik
Mulle väga meeldib virtuaalsete aktorite idee ja leian, et need aitavad mul uurida skaleeritavaid ja usaldusväärseid tööriistu keeruliste töövoogude haldamiseks. Kui iga ülesanne on ühe lõimega virtuaalne osaleja, kaob võistluse tingimuste probleem.
Kuna Orleans ja Dapr on mõlemad Microsofti projektid, kujutan ette päeva Western Story stiilis vastasseisus Microsofti sööklas.
Orleans
Alustasin Orleansiga, sest see on juba mõnda aega minu radaril olnud pärast seda, kui nägin YouTube'is selle kohta videoid. Algus oli väga halb, sest arvasin, et kasutan kõigi nende NuGet pakettide 4.x versiooni. Kuid absoluutselt ükski nende dokumentatsioonist ei tööta 4.x paketiga. Lõpuks kasutasin versiooni 3.6.2.
Terad / Olek / Taimerid
Tera loomine, mis jälgib oma olekut ja sooritab tegevusi, on väga lihtne. Sain isegi jälgida terade püsivuse dokumentatsiooni ja luua oma CosmosDB (SQL API) rakenduse IGrainStorage'ile.
Meeldetuletusi
Meeldetuletusi on samuti lihtne seadistada. Kuni proovisin nende jaoks reaalse maailma püsivust seadistada. Praeguses uurimisetapis püüan hoida kõik korras ja hoida kõik ComsosDB-s. Kahjuks ei saa ma Orleansi meeldetuletus-püsivuse paketti üldse tööle. Lõpuks pidin üle minema AzureStorage paketile. Nüüd on mu andmed pool SQL API kontol ja pool tabeli API kontol.
Ojad
Seal ei läinud mul hästi. Orleansis identifitseeritakse vooge GUID-i ja valikulise nimeruumiga. Kindlasti on hea põhjus, miks vooge tuleb GUID-iga tuvastada, aga vau, see on ebapraktiline.
Olen voogedastuste suhtes väga pettunud, sest sain neid lihtsalt luua, aga kui ma peatun ja taaskäivitan projekti ning käivitan uue sündmuse, jookseb kõik kokku.
Sellele järgneb väga väärtuslik info, sest mul kulus 8 tundi, et Orleansi koodi tagurpidi insenerida, et see välja selgitada:
Kui teravili on voogu tellija, peab tera OnActivateAsync meetodis tellimiskontol kutsuma ResumeAsync'i, vastasel juhul jookseb kokku tuvastamata veaga.
Mul oli ka probleem, et sama tellimus dubleeriti, nii et kustutasin koodi kõigi Graini tellimuste kustutamiseks ja taastasin selle:
Muud Orleansi Mõistatused / Nõuanded
Streams töötab hästi Azure Event Hubsiga (AddEventHubStreamsi kaudu).
Ära kasuta / ega muid erimärke CosmosDB SQL API Grain nimes!
Orleansi järeldus
Mulle meeldib Orleans ja arvan, et seal on potentsiaali. Siiski on sellel väga järsk õppimiskõver. Pikaajalise võitluse tõttu voogedastusega pole mul aega uurida, kuidas klastrid/juurutused töötavad.
Dapr
Leidsin Dapri, otsides alternatiive Orleansile. On veidi kummaline, et see on ka Microsofti toetatud projekt. Võib-olla on nad siin, et rakendada ellujäämisvõime lähenemist. Kui jah, siis arvan, et Dapr jääb ellu.
Esiteks võimaldab Dapr'i REST/gRPC-põhine disain aktorite rakendamist mistahes programmeerimiskeeles. Leidsin ka, et on lihtne käivitada kõik (osalejad, staatused, taimerid, meeldetuletused, sündmused) ühes Redis instantsis. Lisaks kulus mul Dapr'i kasutamiseks vaid umbes kolmandik ajast. Nii kiire käivitamisaeg on tänu Dapri suurepärasele dokumentatsioonile.
Näitlejad / taimerid / meeldetuletused
Kas ma just ütlesin, et Dapri dokumentatsioon on suurepärane? Noh, see on kõikjal, välja arvatud JavaScripti näidetes. Veedan suurema osa ajast Dapriga, püüdes välja mõelda, kuidas kutsuda meetodeid näitlejate pealt. Dapr Javascripti näidise kood on järgmine:
See on selgelt aegunud. Pidin palju aega kulutama, et neid kolme rida läbi Dapr'i testi/näidiskoodi uurimise läbi veenda
Koodinäited oleku saamiseks/seadistamiseks on sarnased probleemid, seega lõin neile GitHubi probleemi.
Välja arvatud need väikesed probleemid, on näitlejate ülesseadmine lihtne.
Taimerite ja meeldetuletuste seadistamine minu kipsile on samuti väga lihtne.
Osariik
Sain Dapri väga lihtsalt seadistada nii, et see püsiks Postgresiga.
Üks asi, mida olen märganud, on see, et meeldetuletuste salvestamisel võib esineda skaleeritavuse probleeme. Dapr salvestab kõik teavitused konkreetse osalejatüübi kohta ühte JSON-massiivi. Mis juhtub, kui kellelgi on palju meeldetuletusi?
Muud Dapr'i küsimused / nõuanded
Üks asi, mida märkasin JavaScripti SDK koodi sirvides, oli see, et koodibaasis pole üldse palju kommentaare. See teeb peaaegu võimatuks midagi välja selgitada. Näiteks olekuhalduri meetodis addOrUpdateState on kolmas parameeter nimega updateValueFactory. Kui koodis pole kommentaare, on peaaegu võimatu aru saada, milleks tagasikutsumine on.
Ma pole ka kindel, kui väga mulle meeldib käsk "dapr init", mis üritab minu jaoks Redis konteinerit seadistada ja käivitada. Mis siis, kui mul on juba Redis konteiner? Mis siis, kui ma tahan kasutada postgres'i? Ma ei leia dokumentatsiooni, mis selgitaks, kuidas dapr init funktsiooni muuta.
Märkus kõigile, kellel on raskusi pubsubi kasutamisega. Pead kasutama "dapr run" funktsiooni, et käitada nii oma kirjastajat kui ka tellijat:
Actorsi ja pubsubi puhul tuleb meeles pidada, et on oluline kasutada --app-port parameetrit, et dapr teaks, millisel pordil su teenus töötab. pubsubi üritused ja näitlejate kõned saadetakse teie teenusele Dapr sidecar'ist HTTP-kõnede kaudu, seega peab see teadma, kuhu neid saata:
Testisin väikest Dapri isehostitud "klastrit", käivitades pubsubi tellijate instantsi kahel erineval arvutil koduvõrgus. See lihtsalt toimis!
Dapri kokkuvõte
Kui soovid rohkem teada hajutatud rakenduste või virtuaalsete aktorite kohta, soovitan alustada Daprist. Orleans oli algne teerajaja, samas kui Dapr oli taaskäivitamine, mis viis asjad järgmisele tasemele.
Originaallink:Hüperlingi sisselogimine on nähtav.
|