Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Is it an actor? No it's a function! ...and it c...

Is it an actor? No it's a function! ...and it can run on KEDA

Andrea Ceroni

October 12, 2019
Tweet

More Decks by Andrea Ceroni

Other Decks in Programming

Transcript

  1. #azuresatpn Azure Saturday 2019 Is it an actor? No it's

    a function! ...and it can run on KEDA
  2. #azuresatpn Durable Functions stateful patterns Function chaining Fan-out / fan-in

    Async HTTP APIs Long-running monitor Human interaction Event aggregator
  3. #azuresatpn Durable Functions Types (bring state back to serverless) Client

    stateless Orchestrator stateful Activity stateless Entity stateful
  4. #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
  5. #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
  6. #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
  7. #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:
  8. #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
  9. #azuresatpn Azure Functions Consumption Plan Artifact Repository (zip archive in

    Blob Storage) download Scale Controller metrics add / remove Function App instances Event Source (queue)
  10. #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
  11. #azuresatpn Azure Functions Consumption Plan Docker Image Repository download Event

    Source (queue) Deployment Scaled Object custom metrics add / remove HPA length Pods
  12. #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...)
  13. #azuresatpn Durable Task on KEDA non è ancora disponibile per

    Durable Functions ma è nel ciclo di sviluppo previsto entro i prossimi 6 mesi J
  14. #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<Question>(); }