Duurzame Functies: Ventilator Uit Ventilator In Patronen

0
38

Deze post is een samenwerking tussen mijzelf en mijn geweldige collega, Maxime Rouiller.

Duurzame Functies? Wat. Als je nieuw bent in Duurzame, ik stel voor dat je hier beginnen met deze post die betrekking heeft op alle essentials, zodat je goed kan duiken. In dit bericht, we gaan om te duiken in een bepaalde use-case, zodat je kunt zien dat een Duurzame Functie patroon op het werk!

Vandaag de dag, laten we praten over de Ventilator, de Ventilator In de patroon. We zullen dat doen door het ophalen van een open probleem graaf van GitHub en vervolgens de opslag van wat we krijgen. Hier is het archief waar alle code van het leven dat we lopen door in deze post.

Bekijk Repo

Over de Fan/Ventilator In Patroon

Hadden We het al kort vermeld dit patroon in het vorige artikel, dus laten we eens bekijken. Je zou waarschijnlijk te bereiken voor dit patroon wanneer u het nodig uitvoeren van meerdere functies in parallel en voer dan een andere taak met deze resultaten. Je kunt je voorstellen dat dit patroon is handig voor heel veel projecten, omdat het vrij vaak dat we om één ding te doen op basis van gegevens uit een aantal andere bronnen.

Bijvoorbeeld, laten we zeggen dat je een meeneem restaurant met een ton van de orders door. U kunt gebruik maken van dit patroon als eerste voor de bestelling, dan kan je dat gebruiken om erachter te komen prijzen voor alle items op de beschikbaarheid van de items, en zie als een van hen een verkoop of aanbiedingen. Misschien is de verkoop/aanbiedingen zijn niet gehost op dezelfde plek als de prijzen omdat ze worden beheerd door een externe sales bedrijf. Mogelijk moet u ook om uit te vinden wat uw levering wachtrij is en die de medewerkers moeten krijgen op basis van hun locatie.

Dat is een stuk van de coördinatie! Maar moet je dan de aggregatie van al die informatie om de order af te ronden en te verwerken. Dit is een vereenvoudigde, gekunsteld voorbeeld natuurlijk, maar je kunt zien hoe nuttig het is om te werken op een paar dingen tegelijk, zodat ze vervolgens kunnen worden gebruikt door een definitieve functie.

Hier is hoe dat eruit ziet, in abstracte code en visualisatie

Zie de Pen Duurzame Functies: Patroon #2, Ventilator, Ventilator door Sarah Drasner (@sdras) op CodePen.

const df = (‘duurzaam-functies’)

de module.export = df(functie*(ctx) {
const taken = []

// de artikelen te verwerken gelijktijdig, toegevoegd aan een array
const taskItems = rendement ctx.df.callActivityAsync(‘fn1’)
taskItems.forEach(item => taken.push(ctx.df.callActivityAsync(‘fn2’, item))
de opbrengst ctx.df.taak.alle(taken)

// stuur de resultaten naar de laatste functie voor het verwerken van
de opbrengst ctx.df.callActivityAsync(‘fn3’, taken)
})

Nu zien we waarom we zouden willen gebruik maken van dit patroon, laten we duiken in een vereenvoudigd voorbeeld legt uit hoe.

Het instellen van uw omgeving om te werken met Duurzame Functies

Eerste dingen eerst. We moeten ontwikkelomgeving klaar om te werken met Duurzame Functies. Laten we breken die naar beneden.

GitHub Persoonlijke Toegangstoken

Dit voorbeeld wilt uitvoeren, moet u een persoonlijke toegangstoken in GitHub. Als u onder uw account foto, open je de vervolgkeuzelijst en selecteer achtereenvolgens Instellingen, dan Developer-instellingen in de linker zijbalk. In dezelfde zijbalk op het volgende scherm, klik op Persoonlijke access tokens optie.

Dan is een aanwijzing zal komen en u kunt op het Genereren van nieuwe token knop. U moet uw token een naam die zinvol is voor dit project. Als “Duurzaam functies zijn beter dan burrito’ s.” Je weet wel, iets wat standaard zoals die is.

Voor de scopes/toestemming optie, stel ik voor het selecteren van “repo ‘ s”, die toelaat om op het Genereren token knop en kopieer de token naar uw klembord. Houd in gedachten dat je nooit moet plegen met uw token. (Het zal worden ingetrokken indien je doen. Mij vragen waarom ik dat weet.) Als u meer info nodig over het maken van tokens, zijn er verdere instructies hier.

Functies CLI

Eerst zullen we installeer de nieuwste versie van de Azuurblauwe Functies CLI. Wij kunnen dit doen door het uitvoeren van dit in onze terminal:

npm i-g azure-functies-core-tools@kern –onveilig-perm ware

Is het onveilig perm vlag freak you out? Het kwam voor mij goed uit. Echt wat het doet is het voorkomen UID/GID schakelen wanneer het pakket scripts uitvoeren, maar dat is noodzakelijk omdat het pakket zelf is een JavaScript-wrapper rond .NETTO. Brew installeren zonder zo ‘ n vlag is ook verkrijgbaar en meer informatie over die hier is.

Optioneel: het opzetten van het project in de VS Code

Helemaal niet nodig, maar ik wil werken in de VS-Code met Azure Functies want het heeft veel lokale debugging, die meestal een pijn met Serverloze functies. Als u nog niet hebt geïnstalleerd, kunt u dit hier doen:

  • Visual Studio Code
  • Azure functies Verlenging

Het opzetten van een Gratis Proefversie voor Azure en het Maken van een Storage Account

Dit voorbeeld wilt uitvoeren, moet u de aandrijving van de test een gratis proefversie voor Azure. Je kan in de portal en teken in de linker bovenhoek. Maak je een nieuwe Blob Storage account en het ophalen van de sleutels. Aangezien we dat alle kwadraat van de afstand, we zijn klaar om te rocken!

Het opzetten van Onze Duurzame Functie

Laten we een kijkje nemen op de repo we hebben de set-up. We clone of fork:

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

Hier is wat dat eerste file structuur.

(Deze visualisatie was van mijn CLI tool.)

In het lokaal.instellingen.json, wijzigen GitHubToken van de waarde die u greep van GitHub eerder, en doe hetzelfde voor de twee opslag — toetsen- plakken in de toetsen van de opslag account die u hebt ingesteld eerder.

Draai dan:

func extensies installeren
npm ik
func host beginnen

En nu we bijna in de buurt!

Het begrijpen van de Orchestrator

Zoals u kunt zien, hebben we een aantal folders in de FanOutFanInCrawler directory. De functies in de mappen GetAllRepositoriesForOrganization, GetAllOpenedIssues, en SaveRepositories zijn de functies die we zullen coördineren.

Hier is wat we gaan doen:

  • De Orchestrator zal kick-off van de GetAllRepositoriesForOrganization functie, waar we pas in de naam van de organisatie, opgehaald uit getInput() van de Orchestrator_HttpStart functie
  • Omdat dit waarschijnlijk meer dan een repo, zullen we eerst een lege array, dan loop door alle van de repo ‘ s en uitvoeren van GetOpenedIssues, en duw die op de matrix. Wat we ‘ re running alle hier brand tegelijkertijd, want het is niet binnen de opbrengst in de iterator
  • Dan zullen we wachten tot alle van de taken te voltooien uitvoeren en ten slotte noemen SaveRepositories die zal opslaan alle resultaten in Blob Storage

Sinds de overige functies zijn vrij standaard, laten we graven in dat Orchestrator voor een minuut. Als we kijken binnen de Orchestrator-map, kunnen we zien het heeft een vrij traditionele setup voor een functie met index.js en functie.json-bestanden.

Generatoren

Voordat we een duik in de Orchestrator, laten we eens een zeer korte tour in generatoren, want je zult niet in staat zijn om te begrijpen van de rest van de code zonder hen.

Een generator is niet de enige manier om dit te schrijven code! Het kan worden bereikt met andere asynchrone JavaScript patronen. Het is gewoon zo gebeurt het dat dit is een mooi schoon en leesbaar te schrijven, dus laten we kijken erg snel.

functie* generator(i) {
opbrengst i++;
opbrengst i++;
opbrengst i++;
}

var gen = generator(1);

console.log(gen.next (volgende).waarde); // 1
console.log(gen.next (volgende).waarde); // 2
console.log(gen.next (volgende).waarde); // 3
console.log(gen.next()); // {waarde: undefined gedaan: true}

Na de eerste kleine sterretje volgende functie* u kunt beginnen met het gebruik van de opbrengst trefwoord. Het aanroepen van een functie generator niet uitvoeren van de gehele functie in zijn geheel; een iterator object wordt geretourneerd. De next() methode zal lopen over hen, één voor één, en we krijgen een object dat ons vertelt zowel de waarde en gedaan, die een boolean of we klaar zijn lopen door alle van de opbrengst verklaringen. U kunt zien in het bovenstaande voorbeeld is dat voor het laatst .volgende() oproep, een object wordt geretourneerd gedaan is waar, laat het ons weten, wij hebben herhaald door alle waarden.

Orchestrator-code

We beginnen met de eisen verklaring hebben wij nodig voor dit werk:

const df = (‘duurzaam-functies’)

de module.export = df(functie*(context) {
// onze orchestrator-code gaat hier
})

Het is vermeldenswaard dat het sterretje er zal een iterator functie.

Eerst zullen we de organisatie naam van de Orchestrator_HttpStart functie en je krijgt alle repo ‘ s voor de organisatie met GetAllRepositoriesForOrganization. Opmerking wij gebruiken rendement binnen de repositories opdracht om de functie uit te voeren in de juiste volgorde.

const df = (‘duurzaam-functies’)

de module.export = df(functie*(context) {
var organizationName = context.df.getInput()
var repositories = rendement context.df.callActivityAsync(
‘GetAllRepositoriesForOrganization’,
organizationName
)
})

Vervolgens gaan we maken een lege array met de naam van de output, het maken van een for-lus uit de reeks kregen we met alle van de organisatie van de repo ‘ s, en gebruik die om de problemen in de matrix. Merk op dat we geen gebruik maken van de opbrengst hier dus dat ze al die tegelijkertijd in plaats van te wachten ene na de andere.

const df = (‘duurzaam-functies’)

de module.export = df(functie*(context) {
var organizationName = context.df.getInput()
var repositories = rendement context.df.callActivityAsync(
‘GetAllRepositoriesForOrganization’,
organizationName
)

var output = []
for (var i = 0; i < repositories.lengte; i++) {
output.push(
de context.df.callActivityAsync(‘GetOpenedIssues’, repositories[i])
)
}

})

Uiteindelijk, wanneer al deze uitvoeringen zijn gedaan, gaan we voor het opslaan van de resultaten en in de SaveRepositories functie, die ze opslaan in de Blob Opslag. Vervolgens keren we terug de unieke ID van de aanleg (context.instanceId).

const df = (‘duurzaam-functies’)

de module.export = df(functie*(context) {
var organizationName = context.df.getInput()
var repositories = rendement context.df.callActivityAsync(
‘GetAllRepositoriesForOrganization’,
organizationName
)

var output = []
for (var i = 0; i < repositories.lengte; i++) {
output.push(
de context.df.callActivityAsync(‘GetOpenedIssues’, repositories[i])
)
}

const resultaten = opbrengst context.df.Taak.alle(output)
de opbrengst context.df.callActivityAsync(‘SaveRepositories’, resultaten)

terug context.instanceId
})

Nu hebben we alle stappen die we nodig hebben voor het beheren van al onze functies met deze single orchestrator!

Implementeren

Nu het leuke gedeelte. Laten we implementeren! 🚀

Voor het implementeren van componenten, Azure moet u het installeren van de Azuurblauwe CLI en login.

Eerste, moet u de service leveren. Kijk in de voorziening.ps1-bestand dat wordt verstrekt om vertrouwd te raken met de middelen die we gaan maken. Vervolgens kunt u het bestand uit te voeren met de eerder gegenereerde GitHub token zoals deze:

.bepaling.ps1 -githubToken <TOKEN> -resourceGroup <ResourceGroupName> -storageName <StorageAccountName> -functienaam <Functienaam>

Als u niet wilt dat PowerShell installeren, u kunt ook de opdrachten in de voorziening.ps1 en voer deze handmatig.

En daar hebben we het! Onze Duurzame Functie is up and running.