tag trykket af dit (eksterne) api med azure webjobs

26
#CampusDays Tag trykket af dit (eksterne) API med Azure Websites WebJobs Christian Dalager, Eksponent @dalager Softwareudvikler og sådan

Upload: christian-dalager

Post on 11-Jul-2015

173 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Tag trykket af dit (eksterne) API med Azure WebJobs

#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

#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

#C

am

pusD

ays

”Arkitektur”

Page 4: Tag trykket af dit (eksterne) API med Azure WebJobs

#C

am

pusD

ays

Bemærkning om Microsoft Azure features…

Page 5: Tag trykket af dit (eksterne) API med Azure WebJobs

#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

#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

#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

#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

#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

#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

#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

#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

#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

#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

#C

am

pusD

ays

Page 16: Tag trykket af dit (eksterne) API med Azure WebJobs

#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

#C

am

pusD

ays

Demo 2: WebJobs

Page 18: Tag trykket af dit (eksterne) API med Azure WebJobs

#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

#C

am

pusD

ays

Demo 3:Azure Storage Queue

Page 20: Tag trykket af dit (eksterne) API med Azure WebJobs

#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

#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

#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

#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

#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

#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

Page 26: Tag trykket af dit (eksterne) API med Azure WebJobs

#C

am

pusD

ays

Q&ASpørgsmål?

Nu eller

• @dalager

[email protected]

• Nedenunder bagefter session