a mathematical model of concurrent computation that treats "actors" as the universal primitives of concurrent computation: in response to a message that it receives, an actor can make local decisions, create more actors, send more messages, and determine how to respond to the next message received. https://en.wikipedia.org/wiki/Actor_model
a mathematical model of concurrent computation that treats "actors" as the universal primitives of concurrent computation: in response to a message that it receives, an actor can make local decisions, create more actors, send more messages, and determine how to respond to the next message received. https://en.wikipedia.org/wiki/Actor_model
being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning -- it took a while to see how to do messaging in a programming language efficiently enough to be useful).» «... OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.» http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en
being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning -- it took a while to see how to do messaging in a programming language efficiently enough to be useful).» «... OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.» http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en
Concurrency • Location transparency • Remote deployment using configuration High Performance • ~50 million messages per second per machine • 1GB heap memory = ~2.5 million actors • Load balancing / routing Resilient • Self-healing • Supervisory hierarchies and fault isolation Simple Distribution Akka.net features
definito dividere il lavoro da svolgere in task più piccoli ogni actor ha un indirizzo gli actor comunicano tramite messaggi un actor è lazy, fino a quando non riceve un messaggio rimane dormiente
messaggi vengono accodati per essere processati l’actor ha uno stato interno che non condivide con nessuno un actor può avere dei figli di cui è responsabile strategia per gestire problemi sui figli (eccezioni) Actor Incoming message mailbox Behaviour State 0,1,...n Children Supervisory Strategy 13
stato dell’actor (se non l’actor stesso in seguito all’arrivo di un messaggio) • garantiscono completa trasparenza sul deploy (ad esempio su un host remoto) • svincolano l’istanza vera e propria dell’actor che può essere così sostituita (restart) senza bisogno di dover aggiornare tutte le referenze 15
nome dell’actor system Address indirizzo IP remoto e porta dell’actor system HierarchyPath path dell’actor nella gerarchia akka://AkkaGame/user/PlayerControllerActor/Andre6 akka.tcp://[email protected]:9002/user/PlayerControllerActor/Andre6 19
to a specific destination… In a message-driven system addressable recipients await the arrival of messagesand react to them, otherwise lying dormant.” The Reactive Manifesto
altro actor • “fire & forget” • non mi aspetto risposta • non rimango bloccato in attesa • scala meglio e più facilmente • molto utilizzato Ask • chiedo qualcosa ad un altro actor • mi aspetto una risposta • l’altro actor deve rispondermi • timeout (TaskCancelledException) • scala più difficilmente • utilizzato solo se necessario 22
actor without needing to know where it is; whether it be in the same actor systeminstance on the same computer, or another actor systeminstance on the other side of the world.
Prop contiene le informazioni necessarie all’actor system per creare correttamente l’istanza. Ad esempio gli argomenti da passare al costruttore e dove deve essere deployato l’actor.
processa messaggi viene creato nell’actor system morto, non può essere restartato clean up sta per ritornare in starting PreStart() PostStop() PreRestart() PostStop() PostRestart() 24
il suo primo messaggio • si usa per inizializzare l’actor e renderlo pronto al primo messaggio PostStop() • chiamato dopo che l’actor è stato stoppato e la sua coda disabilitata • ogni messaggio mandato all’actor dopo questo evento finirà nella deadLetters dell’actor system • custom cleanup • rilasciare le risorse di sistema
restartato sulla vecchia istanza • è possibile fare qualcosa con il messaggio/eccezione corrente (se c’è perchè l’actor potrebbe venire restartato anche a causa di un problema in uno dei fratelli ad esempio...) • ad esempio salvare il messaggio corrente per riprocessarlo dopo • di default stoppa tutti gli eventuali figli e chiama postStop() PostRestart() • chiamato dopo PreRestart() sulla nuova istanza • di default chiama PreStart() quindi è possibile farne l’override per non richiamarlo • è possibile fare qualcosa con l’eventuale eccezione che ha causato il restart • logging
la sua istanza con una nuova, ma actorRef (path + UID) non viene cambiata. Il contenuto della mailbox non viene modificato (può continuare a ricevere messaggi durante il restart) e continuerà ad essere processata dopo il restart 25
metodo Become() switcha al nuovo behavior • il behavior precedente non viene ricordato utilizza uno stack per ricordare i precedenti • il metodo BecomeStacked() switcha al nuovo behavior e pusha nella stack quello precedente • il metodo UnbecomeStacked() estrate dallo stack il behavior precedente e switcha
Actor 3 Actor 4 Actor 1 Actor1 decide come rispondere, ad esempio con Restart Actor2 solleva eccezione l’azione viene propagata nella gerarchia Actor2 e figli vengono sospesi 28
scala a sua volta a livello superiore della gerarchia • l’actor padre viene sospeso a sua volta • anche tutti i figli dell’actor padre vengono sospesi Escalate 33
proteggere il proprio stato delegando il lavoro ai suoi figli • un task rischioso viene spinto sempre più a basso nella gerarchia (Error Kernel) • il figlio svolge il lavoro, nella peggiore delle ipotesi viene restartato dal padre 36
da user guardian (e tutti i figli) e poi system guardian • ActorSystem.Stop(actorRef) stoppa un actor specifico • un figlio può essere stoppato automaticamente dal padre in caso di eccezione • un figlio può essere stoppato manualmente tramite Context.Stop(actorRef) • è possibile mandare il messaggio PoisonPill actorRef.Tell(PoisonPill.Instance) • lo stop avviene in asincrono