Hva er Holdbare Funksjoner?

0
32

Oh no! Ikke mer sjargong! Hva betyr begrepet Holdbar Funksjoner bety? Holdbar funksjoner som har å gjøre med Serverless arkitekturer. Det er en forlengelse av Azure Funksjoner som lar deg skrive stateful henrettelser i en serverless miljø.

Tenk på det på denne måten. Det er noen store fordeler som folk har en tendens til å fokusere på når de snakker om Serverless Funksjoner:

  • De er billige
  • De kan skaleres med behovene dine (ikke nødvendigvis, men det er standard for mange tjenester)
  • De tillater deg å skrive event-drevet kode

La oss snakke om det siste for et minutt. Når du kan skrive event-drevet-koden, kan du bryte dine driftsmessige behov ned til mindre funksjoner som i hovedsak si: når denne forespørselen kommer i, kjøre denne koden. Du trenger ikke å rote rundt med infrastruktur, som er tatt vare på for deg. Det er en ganske overbevisende konsept.

I dette paradigmet, kan du bryte arbeidsflyten ned i mindre, gjenbrukbare biter som i sin tur kan gjøre dem enklere å vedlikeholde. Dette gir deg også mulighet til å fokusere på virksomheten din logikk fordi du er kokende ting ned til den enkleste koden du trenger for å kjøre på serveren din.

Så, her er der Holdbar Funksjoner kommer inn. Du kan sikkert gjette at du kommer til å trenge mer enn én funksjon å kjøre programmet vokser i størrelse og har til å opprettholde flere stater. Og, i mange tilfeller, vil du trenger for å koordinere dem og angi i hvilken rekkefølge de bør kjøre for dem å være effektiv. Det er verdt å nevne på dette punktet at Holdbar Funksjoner er et mønster som bare er tilgjengelig i Azure. Andre tjenester har variasjoner over dette temaet. For eksempel, AWS versjonen kalles Trinn Funksjoner. Så, mens vi snakker om noe som er spesifikke for Azure, det gjelder mer generelt som godt.

Holdbar i aksjon, noen eksempler

La oss si at du selger flybilletter. Du kan forestille deg at når en person kjøper en billett, må vi:

  1. sjekk for informasjon om tilgjengeligheten av billett
  2. gjør en forespørsel om å få setet kart
  3. få sin kjørelengde poeng hvis de er en lojalitet som medlem
  4. gi dem en mobil varsling hvis betalingen kommer gjennom, og de har en installert app/har bedt om varslinger

(Det er vanligvis mer, men vi bruker dette som en base for eksempel)

Noen ganger er disse vil alle løp skal kjøres samtidig, noen ganger ikke. For eksempel, la oss si at de ønsker å kjøpe billett med sin kjørelengde belønninger. Så du vil ha først sjekke priser, og deretter tilgjengeligheten av billetten. Og deretter gjøre noen mørke magi for å sørge for at ingen kunder, selv data forskere, kan faktisk forstå algoritmen bak dine belønninger program.

Orchestrator funksjoner

Enten du kjører disse funksjonene i samme øyeblikk, kjører dem i rekkefølge, eller kjører dem i henhold til hvorvidt vilkåret er oppfylt, vil du sannsynligvis ønske å bruke det som kalles en orchestrator funksjon. Dette er en spesiell type av funksjon som definerer dine arbeidsflyter, gjør, som du kan forvente, iscenesetter de andre funksjonene. De automatisk checkpoint sin fremgang når en venter-funksjonen, som er svært nyttig for å håndtere komplekse asynkron kode.

Uten Holdbar Funksjoner, må du kjøre til et problem av disorganization. La oss si at en funksjon er avhengig av en annen for å brann. Du kan ringe den andre funksjonen direkte fra den første, men den som er å opprettholde koden ville ha til å gå inn i hver enkelt funksjon og holde i tankene sine om hvordan det er å bli kalt og samtidig opprettholde dem separat hvis de trenger endringer. Det er ganske lett å få til noe som ligner innb. helvete, og debugging kan bli veldig vanskelig.

Orchestrator funksjoner, på den annen side, administrere staten og timing av alle andre funksjoner. Den orchestrator funksjonen vil bli sparket av med en orkestrering utløse og støtter både innganger og utganger. Du kan se hvordan dette ville være ganske praktisk! Du administrerer staten i en omfattende måte alt på ett sted. Plus, den serverless funksjonene selv kan beholde jobbene sine begrenset til hva de trenger for å utføre, og som tillater dem å bli mer gjenbrukbare og mindre sprø.

La oss gå over noen mulige mønstre. Vi vil gå utover bare kjeding og snakke om noen andre muligheter.

Mønster 1: Funksjon lenker

Dette er den mest grei gjennomføring av alle mønstre. Det er bokstavelig talt en orchestrator kontrollere et par forskjellige trinnene. Den orchestrator utløser en funksjon, funksjonen er ferdig, orchestrator registrerer det, og klikk deretter neste branner, og så videre. Her er en visualisering av den i aksjon:

Se Penn Holdbar Funksjoner: Mønster #1 – Kjeding av Sarah Drasner (@sdras) på CodePen.

Her er et enkelt eksempel på dette mønsteret med en generator.

const df = krever(“holdbar-funksjoner”)

modul.eksport = df(funksjon*(ctx) {
const x = yield ctx.df.callActivityAsync(‘fn1’)
const y = yield ctx.df.callActivityAsync(‘fn2’, x)
const z = yield ctx.df.callActivityAsync(‘fn3’, y)
avkastning avkastning ctx.df.callActivityAsync(‘fn3’, z)
})

Jeg elsker generatorer! Hvis du ikke er kjent med dem, sjekk ut dette flotte snakke med Bodil om emnet).

Mønster 2: Fan-out/vifte-i

Hvis du har til å utføre flere funksjoner parallelt og må skyte en mer funksjon basert på resultatene, en fan-out/vifte-i et mønster kan være din papirstopp. Vi vil samle resultatene som returneres fra funksjonene fra den første gruppen av funksjoner som skal brukes i den siste funksjonen.

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)
})

Mønster 3: Asynkron HTTP Api

Det er også ganske vanlig at du trenger å gjøre en forespørsel til en API for en ukjent mengde tid. Mange ting som avstand og henvendelser behandles kan gjøre mengden av tid ukjennelige. Det er situasjoner som krever noe av dette arbeidet gjøres først, asynkront, men i tandem, og deretter en annen funksjon for å bli sparket når de første par API-kall er fullført. Async/await er perfekt for denne oppgaven.

Se Penn Holdbar Funksjoner: Mønster #3, Asynkron HTTP Api-av Sarah Drasner (@sdras) på CodePen.

const df = kreve(‘holdbar-funksjoner”)

modul.eksport = df(asynkron ctx => {
const fn1 = ctx.df.callActivityAsync(‘fn1’)
const fn2 = ctx.df.callActivityAsync(‘fn2’)

// svarene som er kommet inn og vente for både å være løst
venter på fn1
venter på fn2

// så dette er det som kalles
venter ctx.df.callActivityAsync(‘fn3’)
})

Du kan sjekke ut mer mønstre her! (Minus animasjoner. 😉)

Komme i gang

Hvis du ønsker å spille rundt med Slitesterk Funksjoner og lære mer, det er en flott tutorial her, med tilsvarende repos til gaffel og jobbe med. Jeg arbeider også med en kollega på en annen post som vil dykke inn i en av disse mønstre som vil være ute snart!

Alternative mønstre

Azure tilbyr en ganske unik ting i Logikk Apps, som gir deg muligheten til å utforme arbeidsflyter visuelt. Jeg er vanligvis en kode-bare-ikke-WYSIWYG lady meg selv, men en av de spennende tingene, om Logikk Apper er at de har ferdige kontakter med tjenester som Twilio og SendGrid, slik at du ikke trenger å skrive som er litt irriterende, for det meste boilerplate-koden. Det kan også integreres med din eksisterende funksjoner, slik at du kan abstrakt unna bare deler koble til midt på treet-systemer og skriv resten av hånden, som kan virkelig hjelpe deg med produktiviteten.