Holdbar Funksjoner: Luft Ut Luft I Mønstre

0
21

Dette innlegget er et samarbeid mellom meg og min fantastiske kollega, Maxime Rouiller.

Holdbar Funksjoner? Wat. Hvis du er ny til Holdbare, foreslår jeg at du starter her med dette innlegget, og som dekker alle de grunnleggende elementene slik at du kan riktig dykke i. I dette innlegget, vi kommer til å dykke inn i en bestemt bruk tilfelle, slik at du kan se en Robust Funksjon mønster på jobb!

I dag, la oss snakke om Fan Ut, Vifte I mønster. Vi vil gjøre dette ved å hente en åpen problemet telle fra GitHub, og deretter lagre det vi får. Her er repo hvor all kode liv som vi vil gå gjennom i dette innlegget.

Vis Repo

Om Viften Ut/Vifte I Mønster

Vi kort omtalt i dette mønsteret i forrige artikkel, så la oss se på. Du vil sannsynligvis komme for dette mønsteret når du trenger å utføre flere funksjoner i parallell og deretter utføre en annen oppgave med disse resultatene. Du kan forestille deg at dette mønsteret er nyttig for ganske mange prosjekter, fordi det er ganske ofte at vi har å gjøre én ting, basert på data fra noen andre kilder.

For eksempel, la oss si at du er en takeaway-restaurant med massevis av bestillinger som kommer gjennom. Du kan bruke dette mønsteret til å først få orden, og deretter bruke den for å finne ut priser for alle elementer, tilgjengelighet av disse elementene, og se om noen av dem har noen salg eller tilbud. Kanskje salg/tilbud er ikke arrangert på samme sted som priser fordi de er kontrollert ved et salg utenfor fast. Det kan også hende du trenger å finne ut hva dine levering kø liker og som på personalet bør få det basert på deres plassering.

Det er mye koordinering! Men du må deretter samlet all informasjon for å fullføre bestillingen og behandle den. Dette er en forenklet, kunstige eksempel på kurset, men du kan se hvor nyttig det er å jobbe på et par ting samtidig, slik at de kan brukes av en siste funksjon.

Her er hva det ser ut som, i abstrakt kode og visualisering

Se Penn Holdbar Funksjoner: Mønster #2, Vifte Ut, Fan av Sarah Drasner (@sdras) på CodePen.

const df = kreve(‘holdbar-funksjoner”)

modul.eksport = df(funksjon*(ctx) {
const oppgaver = []

// elementer for å behandle samtidig lagt til en matrise
const taskItems = yield ctx.df.callActivityAsync(‘fn1’)
taskItems.forEach(item => oppgaver.trykk(ctx.df.callActivityAsync(‘fn2’, element))
gi ctx.df.oppgave.alle(oppgaver)

// send resultater for siste funksjonen for behandling
gi ctx.df.callActivityAsync(‘fn3’, oppgaver)
})

Nå som vi ser derfor ville vi ønsker å bruke dette mønsteret, la oss dykke inn i et forenklet eksempel som forklarer hvordan.

Sette opp ditt miljø å jobbe med Slitesterk Funksjoner

Første ting første. Vi har fått for å få utviklingsmiljø klar til å arbeide med Slitesterk Funksjoner. La oss bryte det ned.

GitHub Personlige Access Token

For å kjøre denne prøven, du trenger for å lage en personlig access token i GitHub. Hvis du går under din konto bilde, åpne rullegardinmenyen, og velg Innstillinger, deretter Utvikler innstillinger i venstre sidebar. I samme sidebar på det neste skjermbildet klikker du Personlig tilgangskoder alternativ.

Deretter en melding vil komme opp, og du kan klikke på Generer nye token-knappen. Du bør gi din token et navn som gir mening for dette prosjektet. Som “Varig funksjoner er bedre enn burritos.” Du vet, noe standard som det.

For det scopes/tillatelse alternativ, foreslår jeg at du velger “repos” som deretter kan du klikke Generere token-knappen og kopier token til utklippstavlen. Husk at du aldri bør legge inn token. (Det vil bli opphevet hvis du gjør det. Spør meg hvorfor jeg vet det.) Hvis du trenger mer info på å skape tokens, det er ytterligere instruksjoner her.

Funksjoner CLI

For det første, vi vil installere den nyeste versjonen av Azure Funksjoner CLI. Vi kan gjøre dette ved å kjøre dette i vår terminal:

npm jeg -g azure-funksjoner-core-tools@core –usikre-perm sant

Gjør de usikre perm flagg freak du ut? Det gjorde det for meg også. Virkelig hva det gjør er å hindre UID/GID bytte når pakken skript som kjører, noe som er nødvendig fordi selve pakken er en JavaScript-wrapper rundt .NET. Brygge installasjon uten en slik flagg er også tilgjengelig, og mer informasjon om det her.

Valgfritt: du kan Sette opp prosjektet i VS-Kode

Helt ikke nødvendig, men jeg liker å jobbe i VS-Koden med Azure Funksjoner fordi det har stor lokal debugging, som vanligvis er en smerte med Serverless funksjoner. Hvis du ikke allerede har installert den, kan du gjøre det her:

  • Visual Studio-Kode
  • Azure-funksjoner Utvidelse

Sett opp en Gratis Prøveperiode for Azure og Opprette en Lagring Konto

For å kjøre denne prøven, vil du trenger for å test kjøre en gratis prøveperiode for Azure. Du kan gå inn i portalen og tegn i det venstre hjørnet. Vil du gjøre en ny Blob Storage konto, og hente nøklene. Siden vi har at alle squared unna, og vi er klar til å rocke!

Sette opp Våre Holdbare Funksjon

La oss ta en titt på repo-vi har satt opp. Vi vil klone eller gaffel det:

git clone https://github.com/Azure-Samples/durablefunctions-apiscraping-nodejs.git

Her er hva som innledende fil struktur er som.

(Dette visualisering ble gjort fra min CLI-verktøyet.)

I lokale.innstillinger.json, endre GitHubToken til verdien du tok fra GitHub tidligere, og gjør det samme for de to oppbevaring nøkler — lim-inn-i-nøkler fra lagring-postkonto du setter opp tidligere.

Deretter kan du kjøre:

func-utvidelser installere
npm jeg
func vert start

Og nå vi kjører lokalt!

Forstå Orchestrator

Som du kan se, har vi en rekke mapper i FanOutFanInCrawler katalogen. Funksjonene i mappene som er listet opp GetAllRepositoriesForOrganization, GetAllOpenedIssues, og SaveRepositories er funksjoner som vi vil være å koordinere.

Her er hva vi skal gjøre:

  • Den Orchestrator vil kick off den GetAllRepositoriesForOrganization funksjon, der vi vil passere i organisasjonen navn, hentet fra getInput() fra Orchestrator_HttpStart funksjon
  • Siden dette er sannsynlig å være mer enn en repo, vil vi først opprette en tom tabell, og deretter bla gjennom alle av repos og kjøre GetOpenedIssues, og trykk dem inn i tabellen. Hva vi kjører her vil alle fire samtidig fordi det ikke er i avkastning i iterator
  • Så får vi vente til alle oppgavene som til slutt utfører og til slutt ringer SaveRepositories som vil lagre alle resultatene i Blob-Lagring

Siden de andre funksjonene er ganske standard, la oss grave i at Orchestrator for et minutt. Hvis vi ser inne i Orchestrator katalog, kan vi se at den har en ganske tradisjonell oppsett for en funksjon med index.js og funksjon.json-filer.

Generatorer

Før vi dykke inn i den Orchestrator, la oss ta en veldig kort siden tour i generatorer, fordi du ikke vil være i stand til å forstå resten av koden uten dem.

En generator er ikke den eneste måten å skrive denne koden! Det kan oppnås med andre asynkrone JavaScript mønstre som godt. Det bare skjer, slik at dette er en ganske ren og lesbar måte å skrive det, så la oss se på det veldig fort.

funksjon* generator(i) {
yield jeg++;
yield jeg++;
yield jeg++;
}

var gen = generator(1);

– konsollen.logg(gen.neste().verdi); // 1
– konsollen.logg(gen.neste().verdi); // 2
– konsollen.logg(gen.neste().verdi); // 3
– konsollen.logg(gen.neste()); // {value: udefinert, gjort: true}

Etter den første lille stjerne følgende funksjon*, kan du begynne å bruke yield søkeord. Kall en generator funksjonen ikke utføre hele funksjon i sin helhet; en iterator objektet er returnert i stedet. Den neste () – metoden vil gå over dem én etter én, og vi vil bli gitt et objekt som forteller oss at både verdi og gjort — noe som vil være en boolsk av om vi er ferdig med å gå gjennom alle gi uttalelser. Du kan se i eksempelet ovenfor, at for den siste .neste() samtale, et objekt er tilbake der gjort er sant, la oss vet at vi har iterated gjennom alle verdier.

Orchestrator kode

Vi vil starte med å kreve uttalelse vi trenger for at dette skal fungere:

const df = kreve(‘holdbar-funksjoner”)

modul.eksport = df(funksjon*(kontekst) {
// våre orchestrator koden vil gå her
})

Det er verdt å merke seg at stjernen vil det lage en iterator funksjon.

Først vil vi få organisasjonen navn fra Orchestrator_HttpStart funksjon og få alle repos for at organisasjonen med GetAllRepositoriesForOrganization. Merk vi bruker yield innenfor depoter i oppdrag å gjøre funksjonen utføre i sekvensiell rekkefølge.

const df = kreve(‘holdbar-funksjoner”)

modul.eksport = df(funksjon*(kontekst) {
var organisasjonsnavn = kontekst.df.getInput()
var depoter = gi kontekst.df.callActivityAsync(
‘GetAllRepositoriesForOrganization’,
organisasjonsnavn
)
})

Så vi kommer til å opprette en tom array som heter utgang, kan du opprette en for-løkke fra matrisen vi fikk inneholder alle organisasjonens repos, og bruke det til å skyve problemene inn i tabellen. Vær oppmerksom på at vi ikke bruke kapasitet her, slik at de er alle kjører samtidig i stedet for å vente en etter en.

const df = kreve(‘holdbar-funksjoner”)

modul.eksport = df(funksjon*(kontekst) {
var organisasjonsnavn = kontekst.df.getInput()
var depoter = gi kontekst.df.callActivityAsync(
‘GetAllRepositoriesForOrganization’,
organisasjonsnavn
)

var output = []
for (var i = 0; i < repositories.lengde; i++) {
utgang.trykk(
sammenheng.df.callActivityAsync(‘GetOpenedIssues’, depoter, [i])
)
}

})

Til slutt, når alle disse henrettelsene er gjort, kommer vi til å lagre resultater og passere som i SaveRepositories funksjon, som vil spare dem til Blob-Lagring. Så får vi tilbake den unike ID-en for eksempel (kontekst.instanceId).

const df = kreve(‘holdbar-funksjoner”)

modul.eksport = df(funksjon*(kontekst) {
var organisasjonsnavn = kontekst.df.getInput()
var depoter = gi kontekst.df.callActivityAsync(
‘GetAllRepositoriesForOrganization’,
organisasjonsnavn
)

var output = []
for (var i = 0; i < repositories.lengde; i++) {
utgang.trykk(
sammenheng.df.callActivityAsync(‘GetOpenedIssues’, depoter, [i])
)
}

const resultatene = gi kontekst.df.Oppgave.alle(utgang)
gi kontekst.df.callActivityAsync(‘SaveRepositories’, resultater)

tilbake sammenheng.instanceId
})

Nå har vi fått alle trinnene vi trenger for å administrere alle av våre funksjoner med denne enkle orchestrator!

Distribuere

Nå er den morsomme delen. La oss distribuere! 🚀

Å distribuere komponenter, Azure krever at du installerer Azure CLI og logge inn med det.

Først, vil du trenger for at tjenesten. Se inn i bestemmelsen.ps1-fil som er gitt for å gjøre deg kjent med de ressursene vi kommer til å lage. Deretter kan du kjøre filen med det som tidligere er generert GitHub-token som dette:

.bestemmelse.ps1 -githubToken <TOKEN> -resourceGroup <ResourceGroupName> -storageName <StorageAccountName> -functionName <FunctionName>

Hvis du ikke ønsker å installere PowerShell, kan du også ta kommandoer i bestemmelsen.ps1 og kjøre det manuelt.

Og der har vi det! Våre Holdbar Funksjonen er oppe og kjører.