Viime viikon aikana olen ryhtynyt ohjelmistokehitykseen tutkimalla virtuaalisten toimijoiden käsitettä. Päädyin tutkimaan kahta eri viitekehystä: Dapr ja Orleans.
Molemmat ovat hyvin ytimekkäitä projekteja, joissa on paljon mielenkiintoisia käyttötapauksia. Molemmat käyttävät "virtuaalisten" toimijoiden ideaa. Virtuaalinen toimija on tila- ja logiikkayksikkö, joka:
- Se voidaan tunnistaa yksikäsitteisesti ID:n perusteella
- Se on yksisäikeinen
- Voi olla muistissa tai pysyvä – sen elinkaari on hallinnassa kehyksen toimesta
Pidän todella virtuaalisten toimijoiden ideasta ja koen niiden olevan erittäin hyödyllisiä skaalautuvien ja luotettavien työkalujen rakentamisessa monimutkaisten tehtävätyönkulkujen hallintaan. Jos jokainen tehtävä on yksisäikeinen virtuaalinen osallistuja, kilpailun kuntoongelma katoaa.
Koska Orleans ja Dapr ovat molemmat Microsoftin projekteja, näen mielessäni päivän Western Story -tyylisessä kohtaamisessa Microsoftin ruokasalissa.
Orléans
Aloitin Orleansista, koska se on ollut mielessäni jo jonkin aikaa nähtyäni siitä videoita YouTubessa. Se alkoi todella huonosti, koska luulin käyttäväni kaikkien heidän NuGet-pakettiensa 4.x-versiota. Kuitenkaan mikään heidän dokumentaatiostaan ei toimi 4.x-paketin kanssa. Päädyin käyttämään versiota 3.6.2.
Jyvät / Tila / Ajastimet
Jyvän luominen, joka seuraa omaa tilaansa ja suorittaa toimintoja, on hyvin yksinkertaista. Pystyin jopa seuraamaan rakeen pysyvyyden dokumentaatiota ja luomaan oman CosmosDB (SQL API) -toteutukseni IGrainStoragesta.
Muistutukset
Muistutukset on myös helppo asettaa. Kunnes yritin konfiguroida niille todellisen maailman pysyvyyttä. Tässä vaiheessa tutkimustani yritän pitää kaiken siistinä ja säilyttää kaiken ComsosDB:ssä. Valitettavasti en saa Orleansin muistutusjatkuvuuspakettia toimimaan lainkaan. Lopulta jouduin vaihtamaan AzureStorage-pakettiin. Nyt tietoni ovat puolet SQL API -tilillä ja puolet taulukko-API-tilillä.
Virrat
Siinä kohtaa en mennyt hyvin. Orleansissa virtaukset tunnistetaan GUID:lla ja valinnaisella nimiavaruudella. Olen varma, että on hyvä syy siihen, miksi striimit täytyy tunnistaa GUID:lla, mutta vau, se on epäkäytännöllistä.
Olen todella turhautunut striimeihin, koska pystyin luomaan ne helposti, mutta kun pysäytän ja käynnistän projektin uudelleen ja käynnistän uuden tapahtuman, kaikki kaatuu.
Tätä seuraa erittäin arvokas tieto, sillä Orleansin koodin käänteissuunnitteluun meni 8 tuntia selvittääkseni sen:
Kun vilja on striimin tilaaja, sen täytyy kutsua ResumeAsync tilauskahvassa OnActivateAsync-menetelmässään, muuten kaadut tunnistamattomalla virheellä.
Minulla oli myös ongelma, että sama tilaus kopioitui, joten käytin koodia poistaakseni kaikki viljan tilaukset ja loin sen uudelleen:
Muita Orleansin pointteja / vinkkejä
Streams toimii hyvin Azure Event Hubsin kanssa (AddEventHubStreamsin kautta).
Älä käytä / tai muita erikoismerkkejä CosmosDB:n SQL-API:n Grain-nimessä!
Orleansin johtopäätös
Pidän Orleansista ja uskon, että siinä on potentiaalia. Kuitenkin oppimiskäyrä on hyvin jyrkkä. Pitkän striimauskamppailuni vuoksi minulla ei ole aikaa opiskella klusterit/käyttöönottojen toimintaa.
Dapr
Löysin Daprin etsimällä vaihtoehtoja Orléansille. On hieman outoa, että kyseessä on myös Microsoftin sponsoroima projekti. Ehkä he ovat täällä ottamassa selviytymisen vahvimman lähestymistavan. Jos kyllä, uskon että Dapr on selviytyjä.
Ensinnäkin Daprin REST/gRPC-pohjainen suunnittelu mahdollistaa aktorien toteuttamisen millä tahansa ohjelmointikielellä. Minusta oli myös helppoa ajaa kaikki (osallistujat, tilat, ajastimet, muistutukset, tapahtumat) yhdellä Redis-instanssilla. Lisäksi Daprin käytön aloittaminen kesti vain noin kolmanneksen ajasta. Näin nopea käynnistysaika johtuu Daprin erinomaisesta dokumentaatiosta.
Näyttelijät / ajastimet / muistutukset
Sanoinko juuri, että Daprin dokumentaatio on erinomaista? No, sitä on kaikkialla, paitsi JavaScript-esimerkeissä. Vietän suurimman osan ajastani Daprin parissa, yrittäen selvittää, miten kutsua menetelmiä näyttelijöille. Dapr Javascriptin näytteen koodi on seuraava:
Tämä on selvästi vanhentunutta. Jouduin käyttämään paljon aikaa näiden kolmen rivin houkutteluun Daprin testi- ja esimerkkikooditutkimuksen läpi
Koodiesimerkeissä tilan saamiseen/asettamiseen on samanlaisia ongelmia, joten loin niille GitHub-ongelman.
Pienten ongelmien lisäksi näyttelijöiden asettaminen on lastenleikkiä.
Ajastimien ja muistutusten asettaminen kipsilleni on myös hyvin helppoa.
Valtio
Pystyin konfiguroimaan Daprin pysymään Postgresilla hyvin helposti.
Yksi asia, jonka olen huomannut, on että muistutusten tallennuksessa saattaa olla skaalautuvuusongelmia. Dapr tallentaa kaikki tietyn osallistujatyypin hälytykset yhteen JSON-taulukkoon. Mitä tapahtuu, jos jollakulla on valtavasti muistutuksia?
Muut Daprin Pointchat / Vinkkejä
Yksi asia, jonka huomasin selaillessani JavaScript SDK:n koodia, on se, että koodipohjassa ei ole juuri lainkaan kommentteja. Tämä tekee lähes mahdottomaksi selvittää jotain. Esimerkiksi tilanhallinnan addOrUpdateState-metodissa on kolmas parametri nimeltä updateValueFactory. Jos koodissa ei ole kommentteja, on lähes mahdotonta sanoa, mihin takaisinsoitto on tarkoitettu.
En myöskään ole varma, kuinka paljon pidän "dapr init" -komennosta, joka yrittää asettaa ja ajaa redis-konttia minulle. Entä jos minulla on jo Redis-purkki? Entä jos haluan käyttää postgresia sen sijaan? En löydä dokumentaatiota, joka selittäisi, miten dapr init -ominaisuutta voisi muuttaa.
Huomio kaikille, joilla on vaikeuksia käyttää pubsubia. Sinun täytyy käyttää "dapr runia" ajaaksesi sekä julkaisijasi että tilaajasi:
Aktoreille ja pubsubille on tärkeää käyttää --app-port-parametria, jotta dapr tietää, millä portilla palvelusi toimii. Pubsub-tapahtumat ja näyttelijäpuhelut lähetetään palvelullesi Dapr Sidecarista http-puheluiden kautta, joten sen täytyy tietää, minne ne lähettää:
Testasin pientä Daprin itse isännöimää "klusteria" käynnistämällä pubsub-tilaaja-instanssini kahdella eri koneella kotiverkossani. Se vain toimi!
Dapr-johtopäätös
Jos haluat tietää lisää ideoita hajautetuista sovelluksista tai virtuaalisista toimijoista, suosittelen aloittamaan Daprista. Orleans oli alkuperäinen edelläkävijä, kun taas Dapr oli uudelleenkäynnistys, joka vei asiat uudelle tasolle.
Alkuperäinen linkki:Hyperlinkin kirjautuminen on näkyvissä.
|