tag trykket af dit (eksterne) api med azure webjobs
TRANSCRIPT
![Page 1: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/1.jpg)
#CampusDays
Tag trykket af dit (eksterne) APImed Azure Websites WebJobs
Christian Dalager, Eksponent
@dalager
Softwareudvikler og sådan
![Page 2: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/2.jpg)
#C
am
pusD
ays
Agenda
1. Meget kort
2. Problemet
3. Løsningen
4. Spørgsmål
![Page 3: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/3.jpg)
#C
am
pusD
ays
”Arkitektur”
![Page 4: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/4.jpg)
#C
am
pusD
ays
Bemærkning om Microsoft Azure features…
![Page 5: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/5.jpg)
#C
am
pusD
ays
Problemet.
Eller: hvordan vi skal være bedre til ikke at lade vores indre påvirke af vores omverden.
![Page 6: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/6.jpg)
#C
am
pusD
ays
Case: jeg har fået den her fede idé...
Vi laver et socialt netværk
- Lidt som Twitter
- Men bare med følelser!!
Men hvordan?
1. Vi bruger åbent api fra sociallytic.dk
2. Profit!
![Page 7: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/7.jpg)
#C
am
pusD
ays
Og jeg har allerede købt domænet!
emotweecon.azurewebsites.net!!!
![Page 8: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/8.jpg)
#C
am
pusD
ays
Demo 1:Hvori vi ser et problem opstå
Case: Emotweecon
![Page 9: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/9.jpg)
#C
am
pusD
ays
Når en bruger er en bruger
• I ordinær brugerinteraktion på et website kan en bruger ikke agere hurtigere end han kan klikke.
• Man skalerer efter antallet af brugere
• Et internt API, der kun betjener Jquery skal kun følge med almindelig vækst
![Page 10: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/10.jpg)
#C
am
pusD
ays
Når brugeren er en maskine...
• Der er ingen bånd, der binder en maskine
• En maskine • beder om ressourcer noget hurtigere end en bruger
• kan aflevere data hurtigere end et menneske
• kan parallellisere
• kan være buggy og ryge i uendeligt loop
![Page 11: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/11.jpg)
#C
am
pusD
ays
Løsningen!
• Hvis vi lader eksterne processer styre vores interne processer?
• Risiko for at trække en hel infrastruktur ned, hvis tingene ikke er afkoblet
• Cascading exceptions: deres YSOD bliver din YSOD.
• Slave af synkron processering – det går også ud over vores brugere
• ”Users can’t signup! WE ARE LOSING MONEY!!”
Problemet
• Afkobling• Temporal
• Computing
• Fx Simple queue-arkitektur
• Aka Messaging
![Page 12: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/12.jpg)
#C
am
pusD
ays
Løsning.
Asynkron processering af køer med Azure WebJobs
![Page 13: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/13.jpg)
#C
am
pusD
ays
Det generelle princip
Alle requests til API bliver smidt på en kø og der svares straks.
Webjob står og tager beskeder af køen. Det kan tage lang tid, men stresses ikke af øgende arbejdsbyrde
![Page 14: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/14.jpg)
#C
am
pusD
ays
Konkret løsning for vores Emotweecon platform
1. Vi tager alle beskeder og lægger dem på køen og svarer brugeren med det samme
2. WebJob fanger besked og sender det til analyse på api.sociallytic.dk
3. Efter endt analyse gemmes resultat i database
4. Så notificeres websiden med SignalR
{
"Id":182,
"Text":"Kode er festligt. Det holder mig i live.",
"Date":"2014-11-24T18:48:52.2743711+00:00",
"Emotion":"positive",
"EmotionScore":1.0
}
![Page 15: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/15.jpg)
#C
am
pusD
ays
![Page 16: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/16.jpg)
#C
am
pusD
ays
WebJobs
• Processer under Azure Websites
• Kan være exe, .sh, .js, .bat og måske mere (men vi kigger kun på .NET)
• Forskellige triggers• Scheduled
• Table
• Blob
• Storage Queue
• Service Bus
• ”Functions” er metoder der bindes til en triggertype• Autoloader public static void/Task metoder i public classes i loadede assemblies
![Page 17: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/17.jpg)
#C
am
pusD
ays
Demo 2: WebJobs
![Page 18: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/18.jpg)
#C
am
pusD
ays
Azure Storage Queues
• Bor i en storage account
• WebJobs SDK wrapper om eksisterende API
• FIFO – first in, first out (ikke nødvendigvis first in-first done!)
• Retries v exception
• Poison-queue
• VisibilityTime (gør først msg ”synlig” i køen på et senere tidspunkt)
• Re-entry on timeout
• 64kb message size
• Max 7 dages message retention, derefter slettes der
• Sikring af idempotens er dit eget ansvar
![Page 19: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/19.jpg)
#C
am
pusD
ays
Demo 3:Azure Storage Queue
![Page 20: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/20.jpg)
#C
am
pusD
ays
Og hvordan skalerer det?!• Flere websites vil skrive til
samme kø
• Et enkelt WebJob vil som default prøve at trække 16 beskeder af en queue og processere parallelt (!)
• 3 websites 48 competing consumers
• Placer evt API på instanser, der ikke laver andet kritisk for at isolere load spikes fra kritiske systemer
• Storage Queues har 200TB message limit...
![Page 21: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/21.jpg)
#C
am
pusD
ays
Et alternativ: Azure Service Bus
Azure Queues Azure Service Bus
• Persistent og Reliable
• Poll API
• 1-60 sekunder i kø
• 200TB I køen
• 64kb/msg
• Slettes efter 7 dage
• Persistent og reliable
• Event API
• <0.1 sekunder i kø
• < 80gb I køen
• 256kb/msg
• Slettes aldrig
• Publish/Subscribe/Topics
• Sessions
• Duplicate detection
• Automatic dead-lettering v timeout
• Del af messaging infrastruktur
![Page 22: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/22.jpg)
#C
am
pusD
ays
Andre forbedringer?
• Kode, der faktisk er produktionsklart
• Rebus af @mookid8000: et Message Bus API/abstraction med masser af features, der kan køre ovenpå
• Azure Service Bus
• Azure Queues(måske...)
• SQL
• MSMQ
• Rabbit MQ
• gudvedhvad)
• https://github.com/rebus-org/Rebus
• Færre statiske klasser og metoder...
![Page 23: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/23.jpg)
#C
am
pusD
ays
Gotchas
• Webjobs• Disconnected dev ikke muligt
• Man kan dog attache debugger til webjob gennem Server Explorer
• Storage Queue• ”never finished” messages dukker op igen efter timeout. Forvirrende state.
![Page 24: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/24.jpg)
#C
am
pusD
ays
Nogle strategier ved forskellige API requesttyper
• GET• load løses ved traditionel caching, paging, og API limits
• POST med 204 nocontent svar (”void”)• Sendes i kø
• Vi tager imod besked, giver en kvittering og lover at udføre arbejdet
• Klienten må selv følge op.
• POST med forventet resultat • Sendes i kø
• Kan løses ved at medsende en callback url/web hook, som så efterfølgende kaldes når arbejdet er udført
• Nogle gange forventes det at være synkront
• Evt SignalR notifikationer
![Page 25: Tag trykket af dit (eksterne) API med Azure WebJobs](https://reader036.vdocuments.net/reader036/viewer/2022081404/55a0ec391a28ab5a088b47f6/html5/thumbnails/25.jpg)
#C
am
pusD
ays
Links
• Demo src: https://github.com/dalager/emotweecon/
• WebJobs ressources: https://github.com/Azure/azure-content/blob/master/articles/websites-webjobs-resources.md
• WebJobs SDK Samples: https://github.com/Azure/azure-webjobs-sdk-samples
• How to work with Azure Queue storage using the webjob sdk: https://github.com/Azure/azure-content/blob/master/articles/websites-dotnet-webjobs-sdk-storage-queues-how-to.md
• Sentiment Analysis på dansk: http://sociallytic.dk