I løpet av den siste uken har jeg satset på programvareutvikling ved å forske på konseptet virtuelle aktører. Jeg endte opp med å se på to forskjellige rammeverk: Dapr og Orleans.
Begge er veldig konsise prosjekter med mange interessante bruksområder. Begge bruker ideen om «virtuelle» aktører. En virtuell aktør er en tilstands- og logikkenhet som:
- Den kan identifiseres entydig ved ID
- Den er enkeltgjenget
- Kan være i minnet eller vedvarende – livssyklusen styres av rammeverket
Jeg liker virkelig ideen om virtuelle aktører og synes de er veldig nyttige i min utforskning av å bygge skalerbare og pålitelige verktøy for å håndtere komplekse oppgaveflyter. Hvis hver oppgave er en enkelttrådet virtuell deltaker, forsvinner racebetingelsesproblemet.
Siden Orleans og Dapr begge er Microsoft-prosjekter, ser jeg for meg en dag i en Western Story-stil duell i Microsofts kantine.
Orleans
Jeg startet med Orleans fordi det har vært på radaren min en stund etter å ha sett noen videoer om det på YouTube. Det startet veldig dårlig fordi jeg trodde jeg skulle bruke 4.x-versjonen av alle deres NuGet-pakker. Men absolutt ingen av dokumentasjonene deres fungerer med 4.x-pakken. Jeg endte opp med å bruke versjon 3.6.2.
Korn / Tilstand / Timere
Å lage et korn som sporer sin egen tilstand og utfører handlinger er veldig enkelt. Jeg klarte til og med å følge dokumentasjonen for kornpersistens og lage min egen CosmosDB (SQL API)-implementering av IGrainStorage.
Påminnelser
Påminnelser er også enkle å sette opp. Inntil jeg prøvde å konfigurere reell persistens for dem. På dette tidspunktet i forskningen min prøver jeg å holde alt ryddig og lagre alt i ComsosDB. Dessverre får jeg ikke Orleans' påminnelsesvedvaringspakke til å fungere i det hele tatt. Jeg endte opp med å måtte bytte til AzureStorage-pakken. Så nå er dataene mine halvparten i SQL API-kontoen og halvparten i tabell-API-kontoen.
Bekker
Det var der jeg ikke gikk bra. I Orleans identifiseres flyter av en GUID og et valgfritt navnerom. Jeg er sikker på at det finnes en god grunn til at strømmer må identifiseres av en GUID, men wow, det er upraktisk.
Jeg er veldig frustrert over streams fordi jeg klarte å lage dem enkelt, men når jeg stopper og starter prosjektet på nytt og utløser en ny hendelse, krasjer alt.
Dette etterfølges av en svært verdifull informasjon, da det tok meg 8 timer å reversere Orleans-koden for å finne det ut:
Når et korn er en strømabonnent, må kornet kalle ResumeAsync på abonnementshåndtaket i sin OnActivateAsync-metode, ellers krasjer du med en feilmelding som ikke er gjenkjent.
Jeg hadde også problemet med at det samme abonnementet var duplisert, så jeg brukte koden til å slette alle kornets abonnementer og opprettet det på nytt:
Andre Orleans-feller / tips
Streams fungerer godt med Azure Event Hubs (via AddEventHubStreams).
Ikke bruk / eller andre spesialtegn i Grain-navnet til CosmosDB SQL API!
Orleans-konklusjon
Jeg liker Orleans, og jeg tror det har potensial. Men det har en veldig bratt læringskurve. På grunn av min lange kamp med streaming, har jeg ikke tid til å studere hvordan klynger/distribusjoner fungerer.
Dapr
Jeg fant Dapr ved å lete etter alternativer til Orléans. Det er litt merkelig at det også er et Microsoft-sponset prosjekt. Kanskje er de her for å ta en overlevelsesstrategi for den sterkeste. Hvis ja, tror jeg Dapr vil være en overlever.
For det første tillater Daprs REST/gRPC-baserte design at aktører kan implementeres med hvilket som helst programmeringsspråk. Jeg syntes også det var trivielt å kjøre alt (deltakere, statuser, timere, påminnelser, hendelser) på én enkelt Redis-instans. I tillegg tok det meg bare omtrent en tredjedel av gangene å begynne å bruke Dapr. En så rask oppstartstid skyldes Daprs utmerkede dokumentasjon.
Skuespillere / Timere / Påminnelser
Sa jeg nettopp at Daprs dokumentasjon er flott? Vel, det finnes overalt, bortsett fra JavaScript-eksempler. Jeg bruker mesteparten av tiden min på Dapr, og prøver å finne ut hvordan jeg skal bruke metoder på skuespillere. Koden for Dapr Javascript-eksempelet er som følger:
Dette er tydeligvis utdatert. Jeg måtte bruke mye tid på å lokke disse tre linjene gjennom Daprs test-/eksempelkodeutforskning
Kodeeksemplene for å hente/sette tilstand har lignende problemer, så jeg opprettet et GitHub-problem for dem.
Bortsett fra de små problemene, er det enkelt å sette opp skuespillere.
Å sette tidtakere og påminnelser for kastet mitt er også veldig enkelt.
Tilstand
Jeg klarte å konfigurere Dapr til å vedvare med Postgres veldig enkelt.
En ting jeg har lagt merke til er at det kan være skalerbarhetsproblemer med hvordan påminnelser lagres. Dapr lagrer alle varsler for en spesifikk deltakertype i et enkelt JSON-array. Hva skjer hvis noen har mange påminnelser?
Andre Dapr-feller / tips
En ting jeg la merke til da jeg bladde gjennom koden til JavaScript SDK, er at det ikke er mange kommentarer i kodebasen i det hele tatt. Dette gjør det nesten umulig å finne ut av noe. For eksempel, i state managers addOrUpdateState-metode, finnes det en tredje parameter kalt updateValueFactory. Hvis det ikke er noen kommentarer i koden, er det nesten umulig å vite hva tilbakekallingen er til.
Jeg er heller ikke sikker på hvor mye jeg liker kommandoen "dapr init" når jeg prøver å sette opp og kjøre en redis-container for meg. Hva om jeg allerede har en redis-beholder? Hva om jeg heller vil bruke Postgres? Jeg finner ingen dokumentasjon som forklarer hvordan man endrer DAPR Init-funksjonen.
En beskjed til alle som har problemer med å bruke pubsub. Du må bruke "dapr run" for å drive både utgiveren og abonnenten din:
For aktører og pubsub, merk at det er viktig å bruke parameteren --app-port for å la DAPR vite hvilken port tjenesten din kjører på. pubsub-hendelser og aktørkall sendes til tjenesten din fra Dapr-sidevognen via http-kall, så den må vite hvor de skal sendes:
Jeg testet en liten Dapr selvhostet "klynge" ved å starte pubsub-abonnentinstansen min på to forskjellige maskiner på hjemmenettverket mitt. Det bare fungerte!
Dapr-konklusjon
Hvis du vil vite flere ideer om distribuerte applikasjoner eller virtuelle aktører, anbefaler jeg at du starter med Dapr. Orleans var den opprinnelige pioneren, mens Dapr var en reboot som tok ting til neste nivå.
Original lenke:Innloggingen med hyperkoblingen er synlig.
|