Vad är Hållbara Funktioner?

0
13

Åh nej! Inte mer jargong! Exakt vad innebär begreppet Hållbar Funktioner betyder? Hållbara funktioner som har att göra med Serverlösa arkitekturer. Det är en utvidgning av Azure Funktioner som tillåter dig att skriva stateful avrättningar i serverlösa miljö.

Tänk på det här sättet. Det finns några stora fördelar med att människor tenderar att fokusera på när de talar om Serverlösa Funktioner:

  • De är billiga
  • De skala med dina behov (inte nödvändigtvis, men det är standard för många tjänster)
  • De tillåter dig att skriva händelsestyrda kod

Låt oss tala om det sista för en minut. När du kan skriva händelsestyrda kod, kan du bryta din operativa behoven ner i mindre funktioner som i huvudsak säger: när denna begäran kommer in, kör den här koden. Du behöver inte röra runt med infrastruktur, som tagit hand om för dig. Det är ett ganska övertygande koncept.

I detta paradigm, kan du bryta ditt arbetsflöde ner i mindre, återanvändbara delar som i sin tur kan göra dem lättare att underhålla. Detta gör också att du kan fokusera på din verksamhet logik eftersom du koka ner saker och ting till det enklaste koden du behöver för att köras på din server.

Så, här är där Tålig Funktioner kommer in. Du kan nog gissa att du kommer att behöva mer än en funktion för att köra din ansökan växer i storlek och för att behålla fler stater. Och, i många fall, du kommer att behöva för att samordna dem och ange i vilken ordning de bör genomföras för att de skall vara effektiv. Det är värt att nämna på denna punkt som Varaktigt Funktioner är ett mönster som endast är tillgänglig i Azure. Andra tjänster har variationer på detta tema. Till exempel, AWS version som kallas Steg-Funktioner. Så, medan vi pratar om något som är specifika för Azure, det gäller mer generellt.

Tålig in action, några exempel

Låt oss säga att du säljer flygbiljetter. Kan du föreställa dig att när en person köper en biljett, vi behöver:

  1. kontrollera tillgänglighet av biljett
  2. gör en förfrågan för att få plats karta
  3. att få sin körsträcka poäng om de är en lojalitet medlem
  4. ge dem en mobil anmälan om betalning kommer igenom, och de har en app installerad/har begärt anmälningar

(Det finns vanligen flera, men vi använder detta som en bas för exempel)

Ibland dessa kommer alla att köra köras samtidigt, ibland inte. Till exempel, låt oss säga att de vill köpa biljett med sin körsträcka belöningar. Då skulle du ha för att först kontrollera awards, och då tillgången på biljetten. Och sedan göra lite mörk magi för att se till att inga kunder, även data som forskare, kan faktiskt förstå algoritmen bakom dina belöningar program.

Orchestrator funktioner

Om du använder dessa funktioner i samma ögonblick, kör dem i ordning, eller kör dem utifrån om ett villkor är uppfyllt, vill du förmodligen att använda vad som kallas en orchestrator-funktion. Detta är en speciell typ av funktion som definierar dina arbetsflöden, gör, som du kanske tror, iscensättandet andra funktioner. De automatiskt checkpoint deras framsteg när en funktion som väntar, vilket är mycket användbart för att hantera komplexa asynkron kod.

Utan Hållbara Funktioner, du stöter på ett problem i oordning. Låt oss säga att en funktion är beroende av en annan för att brand. Du kan kalla den andra funktionen direkt från början, men vem som är att underhålla koden skulle ha att gå in på varje enskild funktion och hålla i minnet hur det är att bli kallad samtidigt som dem separat om de behöver ändras. Det är ganska lätt att få till något som liknar återuppringning helvetet, och felsökning kan bli riktigt knepigt.

Orchestrator funktioner, å andra sidan, förvalta staten och timing av alla andra funktioner. Den orchestrator-funktionen kommer att sparkas igång av en orkestrering utlösa och stöder både ingångar och utgångar. Du kan se hur detta skulle vara en ganska händig! Du är verkställande staten på ett övergripande sätt allt på ett ställe. Plus, serverlösa funktioner själva kan behålla sina jobb begränsat till vad de behöver för att genomföra, vilket tillåter dem att bli mer återanvändbara och mindre skör.

Låt oss gå över några möjliga mönster. Vi ska gå längre än att bara kedja och prata om lite andra möjligheter.

Mönster 1: Funktion chaining

Detta är den enklaste genomförandet av alla mönster. Det är bokstavligen en orchestrator för att kontrollera några olika steg. Den orchestrator utlöser en funktion, funktionen avslutas, den orchestrator registrerar det, och sedan nästa bränder, och så vidare. Här är en visualisering av att i handling:

Se Pennan Hållbara Funktioner: Mönster #1 – Kedja av Sarah Drasner (@sdras) på CodePen.

Här är ett enkelt exempel på detta mönster med en generator.

const df = require(“durable-funktioner”)

modulen.exporten = df(funktion*(ctx) {
const x = avkastning ctx.df.callActivityAsync(‘fn1 -‘)
const y = avkastning ctx.df.callActivityAsync(‘fn2 -‘, x)
const z = avkastning ctx.df.callActivityAsync(‘fn3’, y)
avkastning avkastning ctx.df.callActivityAsync(‘fn3’, z)
})

Jag älskar generatorer! Om du inte är bekant med dem, kolla in detta fantastiska föredrag av Bodil på ämnet).

Mönster 2: Fan in/fan-i

Om du måste köra flera funktioner samtidigt behöver för att avfyra ytterligare en funktion som bygger på resultat, en fläkt/fan-i mönster kan vara din sylt. Vi kommer att samla resultat som returneras från funktioner från den första gruppen av funktioner för att användas i den sista funktionen.

Se Pennan Hållbara Funktioner: Mönster #2, Fan, Fan av Sarah Drasner (@sdras) på CodePen.

const df = require(‘tålig-funktioner”)

modulen.exporten = df(funktion*(ctx) {
const uppgifter = []

// poster till processen samtidigt, läggas till i en array
const taskItems = avkastning ctx.df.callActivityAsync(‘fn1 -‘)
taskItems.forEach(artikel => uppgifter.push(ctx.df.callActivityAsync(‘fn2 -‘ punkt))
avkastning ctx.df.uppgift.alla(uppgifter)

// skicka resultaten till sista funktionen för bearbetning
avkastning ctx.df.callActivityAsync(‘fn3’, aktiviteter)
})

Mönster 3: Asynkron HTTP-Api: er

Det är också ganska vanligt att du behöver för att göra en förfrågan till ett API för en okänd tid. Många saker som avstånd och mängd förfrågningar behandlas kan göra den tid som okända. Det finns situationer som kräver en del av detta arbete att göras först, asynkront, men i kombination, och sedan en annan funktion för att få sparken när de första API-anrop är klar. Async/väntar är perfekt för denna uppgift.

Se Pennan Hållbara Funktioner: Mönster #3, Async HTTP Api: er av Sarah Drasner (@sdras) på CodePen.

const df = require(‘tålig-funktioner”)

modulen.exporten = df(asynkron ctx => {
const fn1 = ctx.df.callActivityAsync(‘fn1 -‘)
const fn2 = ctx.df.callActivityAsync(‘fn2 -‘)

// de svar som kommer in och vänta både för att lösas
väntar fn1
väntar fn2

// så här den här heter
väntar ctx.df.callActivityAsync(‘fn3’)
})

Du kan kolla in mer mönster här! (Minus animationer. 😉)

Komma igång

Om du vill spela runt med Hållbara Funktioner och lära sig mer, det är en jättebra tutorial här, med motsvarande repor till gaffel och arbeta med. Jag arbetar också med en medarbetare på ett annat inlägg som kommer att dyka i en av dessa mönster som kommer ut snart!

Alternativa mönster

Azure erbjuder en ganska unik sak i Logik Appar, som ger dig möjlighet att utforma arbetsflöden visuellt. Jag är oftast en kod-bara-inte-WYSIWYG lady mig själv, men en av de tvingande saker om Logik Appar är att de har färdiga kontakter med tjänster som Twilio och SendGrid, så att du inte behöver skriva det en aning irriterande, mestadels boilerplate-kod. Det kan också integrera med din befintliga funktioner så att du kan abstrakt bort bara de delar som ansluter till mitten-tier system och skriva resten av sidan, som verkligen kan hjälpa till med produktiviteten.