En del almindelige websites har brug for at udstille enkle API'er til deres omverden. Det kan f.eks. være leveringsnotifkationer fra email- eller SMS-services, der forventer at få et hurtigt svar tilbage. Man kan imidlertid ikke kontrollere en ekstern service, og det betyder at der kan være en risiko for at ens API en dag bliver flood'et af requests, som alle sammen vil have adgang til dine kritiske komponenter som f.eks. databasen og hvad man ellers har kørende af forretningssystemer. Christian Dalager vil i sessionen vise, hvordan man med et enkelt setup kan komme i gang med at throttle inbound integrationspunkter med Azure Websites, WebJobs og Queues.
6. #CampusDays
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!
7. #CampusDays
Og jeg har allerede købt domænet!
emotweecon.azurewebsites.net!!!
9. #CampusDays
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
10. #CampusDays
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
11. #CampusDays
• 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!!”
Løsningen!
Problemet
• Afkobling
• Temporal
• Computing
• Fx Simple queue-arkitektur
• Aka Messaging
13. #CampusDays
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
14. #CampusDays
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
}
16. #CampusDays
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
18. #CampusDays
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
20. #CampusDays
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...
21. #CampusDays
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
22. #CampusDays
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...
23. #CampusDays
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.
24. #CampusDays
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
25. #CampusDays
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
Title Slide – Insert session title, session code and speaker names
Project this slide while attendees are arriving.
Please do not add additional elements to this slide
Kan som regel ikke lide begrebet. Det har det med at skabe afstand til det konkrete. Håndværket. Fingrene.
Det skræmmer udviklere fra at tænke vigtige arkitektoniske tanker
Softwarearkitektur er for *alle*
Løsningsarkitektur plejer at være tættere bundet til det konkrete.
I dag vil vi tale om noget, der normalt falder under ”arkitektur” begrebet.
Men det jeg vil prøve at illustrere, er, at det i virkeligheden kan være en simpel teknik til at løse en bestemt type af problemer
Vi behøver ikke kalde det arkitektur. Eller for et enterprise pattern. Det er bare endnu et stykke værktøj i udviklerens ruskindsbælte.
Det her kommer til at handle om, hvordan man kan løse en konkret type af problemer i ”ren Azure”.
Jeg ved ikke alt om Azure
Jeg ved ikke alt om asynkrone messaging arkitekturer
Jeg kommer til at sende spørgsmål tilbage til publikum, hvis jeg ikke kender svaret