Slide 1

Slide 1 text

#azuresatpn Azure Saturday 2019 Is it an actor? No it's a function! ...and it can run on KEDA

Slide 2

Slide 2 text

#azuresatpn klabcommunity.org elfo.net @andrekiba https://github.com/andrekiba https://www.linkedin.com/in/andreaceroni Andrea Ceroni [email protected]

Slide 3

Slide 3 text

#azuresatpn Durable Entities and KEDA

Slide 4

Slide 4 text

#azuresatpn Durable Functions stateful patterns Function chaining Fan-out / fan-in Async HTTP APIs Long-running monitor Human interaction Event aggregator

Slide 5

Slide 5 text

#azuresatpn Durable Functions Types (bring state back to serverless) Client stateless Orchestrator stateful Activity stateless Entity stateful

Slide 6

Slide 6 text

#azuresatpn Durable Functions Actions [DurableClient] IDurableOrchestrationClient Client output Binding • Start orchestration • Query orchestration • Terminate orchestration • Signal orchestration • Signal entity • Query entity [OrchestrationTrigger] IDurableOrchestrationContext Orchestrator Function • Call an activity • Call sub-orchestrator • Set status • Call entity [EntityTrigger] IDurableEntityContext Entity Function • Initialize • Destroy • Handle event • Set state

Slide 7

Slide 7 text

#azuresatpn Durable Entities Serverless virtual actors sono molto simili agli actors (Akka.Net, Orleans) ma con alcune sostanziali differenze Explicit state esprimono lo stato in modo "esplicito" e non sotto forma di workflow come accade con gli orchestrator, ma posso essere utilizzate insieme agli orchestrator Reliability per i messaggi (call - signal) viene garantita la consegna "exactly-once" la comunicazione avviene attraverso code persistenti (Azure Storage Queue) che garantiscono ordinamento e de-duplicazione I messaggi vengono processati uno alla volta

Slide 8

Slide 8 text

#azuresatpn EntityId EntityId una entity è univocamente definita in base al suo id nella forma @EntityType@EntityKey, ad esempio @Light@Hue1 SingnalEntityAsync vs CallEntitiyAsync "signaling" significa fare l'enqueue di un'operazione (comando asincrono ane-way) "call" è invece utilizzabile solo all'interno di un orchestrator e ritorna direttamente una risposta Proxy definendo un'interfaccia, che l'entity dovrà implementare, possiamo svolgere operazioni sulla entity in modo type-safe evitando le magic string nel codice

Slide 9

Slide 9 text

#azuresatpn Demo

Slide 10

Slide 10 text

#azuresatpn Confronto con virtual actors In comune: • indirizzabili tramite ID • esecuzione seriale delle operazioni • create automaticamente durante la prima operazione • scaricate dalla memoria quando non utilizzate • i messaggi vengono consegnati in ordine e in modo affidabile • supportano lock distribuito tramite orchestrator • pattern request/response possibile solo dall'orchestrator (entity-to-entity solo signaling come negli actors) Differenze:

Slide 11

Slide 11 text

#azuresatpn Azure Functions on K8s

Slide 12

Slide 12 text

#azuresatpn Azure Functions Runtime Event Source Runtime Azure Functions runtime è un processo host che sa come "pullare" eventi da una fonte e passarli alla funzione Event Source è definito tramite il trigger associato alla funzione Horizontal Scaling tipicamente un runtime solo non basta ma non ha nemmeno senso averne uno attivo sempre quando non ci sono eventi

Slide 13

Slide 13 text

#azuresatpn Azure Functions Consumption Plan Artifact Repository (zip archive in Blob Storage) download Scale Controller metrics add / remove Function App instances Event Source (queue)

Slide 14

Slide 14 text

#azuresatpn KEDA (K8s Event Driven Autoscaling) KEDA implementa l'autoscaling event-driven nel "linguaggio di Kubernetes" Docker + KEDA il runtime è fornito in un container docker, KEDA supporta lo scale controller 0...N scaling fornendo metriche custom per Kubernetes Horizontal Pod Autoscaler il numero di pod è zero se non ci sono eventi che triggerano la funzione cresce dinamicamente in base agli eventi per poi tornare di nuovo a zero Si replica il modello serverless event-driven su un cluster K8s

Slide 15

Slide 15 text

#azuresatpn Azure Functions Consumption Plan Docker Image Repository download Event Source (queue) Deployment Scaled Object custom metrics add / remove HPA length Pods

Slide 16

Slide 16 text

#azuresatpn How KEDA works attiva o disattiva i deployment in base al carico di eventi fa da Metrics Server esponendo metriche custom (lunghezza della coda...) che guidano l'HPA l'evento può essere consumato direttamente e questo preserva l'integrazione, senza perdere nulla dell'evento stesso diversi scaler in preview (rabbit, storage queue...)

Slide 17

Slide 17 text

#azuresatpn ScaledObject e HPA https://github.com/kedacore/keda/tree/master/spec

Slide 18

Slide 18 text

#azuresatpn Demo

Slide 19

Slide 19 text

#azuresatpn Durable Task on KEDA non è ancora disponibile per Durable Functions ma è nel ciclo di sviluppo previsto entro i prossimi 6 mesi J

Slide 20

Slide 20 text

#azuresatpn Links https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-overview https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-preview https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-entities https://github.com/Azure/azure-functions-durable-extension/tree/v2 https://www.youtube.com/watch?v=aHue7XuNYZA https://docs.microsoft.com/en-us/azure/azure-functions/functions-kubernetes-keda https://github.com/kedacore/keda

Slide 21

Slide 21 text

#azuresatpn public class Question { public string Answer{ get; set; } public void AskAQuestion(string question) => Answer = ThinkAboutTheAnswer( J ); public string RetrieveTheAnswer() => this.Answer; [FunctionName(nameof(Question))] public static Task Run( [EntityTrigger] IDurableEntityContext ctx, => ctx.DisptachAsync(); }

Slide 22

Slide 22 text

#azuresatpn Thanks! [email protected] [email protected] @andrekiba http://github.com/andrekiba http://www.linkedin.com/in/andreaceroni https://creativecommons.org/licenses/by-nc-sa/3.0/