SlideShare a Scribd company logo
1 of 55
Download to read offline
Scala e Akka
Massimiliano Dessì




                       Scala e Akka
              Programmazione Funzionale
                per architetture scalabili
             multicore, distribuite e su cloud


                        Massimiliano Dessì




                                             GULCh
 Cagliari, 2011-10-22
                                                     1
Scala e Akka
Massimiliano Dessì



    Speaker
        Dad of three
        Co-fondatore e Presidente Java UG Sardegna                                   (http://www.jugsardegna.org)

        Fondatore Google Technology UG Sardegna                                 ((http://sardegna.gtugs.org)

        Coordinatore SpringFramework UG Italia
        Software Architect/Senior Engineer Energeya                                   ((http://www.energeya.com)

        Autore di “Spring 2.5 Aspect Oriented Programming”
        (http://www.packtpub.com/aspect-oriented-programming-with-spring-2-5/book)




 Cagliari, 2011-10-22
                                                                                                                    2
Scala e Akka
Massimiliano Dessì



    Legge di Moore
    Anni fa i processori eseguivano le istruzioni sequenzialmente .

    I miglioramenti della tecnologia hanno aumentato il numero di
    operazioni per unita di tempo aumentando i transistor.




 Cagliari, 2011-10-22
                                                                      3
Scala e Akka
Massimiliano Dessì



    Legge di Amdahl
    Da qualche anno aumenta il numero di core

    "Il miglioramento che si può ottenere su una certa parte del
    sistema è limitato dalla frazione di tempo in cui tale attività ha
    luogo", "Make the common case fast"




 Cagliari, 2011-10-22
                                                                         4
Scala e Akka
Massimiliano Dessì



    Multithread




     La CPU simula delle esecuzioni contemporanee del software con
        delle pause e dei cambiamenti di contesto nei propri registri.

     In alcuni sistemi come la Java Virtual Machine, vengono eseguiti
                     algoritmi di ottimizzazione del codice compilato

                eseguendo anche il riordinamento delle operazioni.




 Cagliari, 2011-10-22
                                                                         5
Scala e Akka
Massimiliano Dessì



    “Houston abbiamo un problema”


       Per decenni sono state scritte applicazioni pensate per essere
         eseguite in maniera strettamente sequenziale (sequential
                               consistency).

        Oggi le applicazioni sono eseguite su processori multi core in
     maniera parallela e concorrente per avere migliori performance.




 Cagliari, 2011-10-22
                                                                         6
Scala e Akka
Massimiliano Dessì



    “Skywalker usa la forza che è in te”



                        Dobbiamo pensare e scrivere

                         il codice immaginando che

                           possa essere eseguito

                          senza vincoli di ordine,

                         contemporaneamente su

                           n-thread di esecuzione

                              e su core diversi


 Cagliari, 2011-10-22
                                                      7
Scala e Akka
Massimiliano Dessì



    Mutable il lato oscuro della forza
       Il problema nasce dalla natura mutabile dei costrutti utilizzati.

             Dati contenuti in una struttura mutabile devono essere
          sincronizzati in lettura e scrittura affinchè due o più thread

         possano operare nella maniera corretta affinchè i dati siano
           sempre in uno stato congruente per ogni thread che deve
                               operare su di essi,

     ma sopratutto perchè i dati scritti da un thread siano visibili agli
                                      altri.




 Cagliari, 2011-10-22
                                                                            8
Scala e Akka
Massimiliano Dessì



    Passa la cera, togli la cera




          Ogni volta che la cpu assegna uno slot di esecuzione ad un
               thread deve ripristinare il contesto per eseguirlo.
          Se in questo slot il thread deve mettersi a sincronizzare gli
         accessi sui dati contenuti nei registri stiamo semplicemente
                            sprecando cicli di clock.




 Cagliari, 2011-10-22
                                                                          9
Scala e Akka
Massimiliano Dessì



    No Panic.....




      D'altra parte, se le parti di codice con accesso concorrente non
                sono ben scritte possiamo avere dei comportamenti
                                   imprevedibili
         oppure possiamo avere l'illusione che il codice funzioni, ma
                          questo solo per pura fortuna.




 Cagliari, 2011-10-22
                                                                         10
Scala e Akka
Massimiliano Dessì



    Legge di Murphy



         Semplicemente non si deve scrivere il codice pensando che
                    alcune situazioni non avverranno.

                     Scommettere sulle combinazioni delle chiamate

                          con miliardi di operazioni al secondo

                           non si può definire meno che folle.




 Cagliari, 2011-10-22
                                                                     11
Scala e Akka
Massimiliano Dessì



    Legge di Murphy II




                          Sfortunatamente non si può
                         testare il codice per riprodurre
                         il modo in cui verrà chiamato
                                 da più thread,
                        tantomeno con un ordine preciso




 Cagliari, 2011-10-22
                                                            12
Scala e Akka
Massimiliano Dessì



    Java Memory Model




                         Le uniche certezze che abbiamo sono su

                        cosa viene eseguito prima di qualcos'altro,

                            in base alle regole happens before

                            del Java memory model (JSR-133)




 Cagliari, 2011-10-22
                                                                      13
Scala e Akka
Massimiliano Dessì



     Immutable




          Oggetti immutabili possono invece essere condivisi tra più
          thread perchè nessuno potrà operare modifiche su di essi.
           Strutture dati immutabili, cioè create nuove (in maniera
          opportuna e non dispendiosa) per ciascuna modifica, sono
          ugualmente condivisibili senza necessità di lock su di esse.




 Cagliari, 2011-10-22
                                                                         14
Scala e Akka
Massimiliano Dessì



    Linguaggi imperativi




       Il software eseguito dalle CPU, scritto con linguaggi imperativi
        come C, C++, Java, C# fornisce delle astrazioni per descrive
                         cosa deve essere eseguito.
      In alcune situazioni tramite un linguaggio imperativo dobbiamo
     condividere delle strutture dati con altri thread di esecuzione del
                               nostro codice.




 Cagliari, 2011-10-22
                                                                           15
Scala e Akka
Massimiliano Dessì



                              Linguaggi imperativi




     Dobbiamo quindi preoccuparci di gestire correttamente l'accesso
                    concorrente dei diversi thread.
                     Dobbiamo stare attenti a dettagli di basso livello.
                          Possiamo fare errori molto facilmente.
                             Dobbiamo gestire dei data races.
                             Lock, Latch, Barrier, semaphores




 Cagliari, 2011-10-22
                                                                           16
Scala e Akka
Massimiliano Dessì



                        Linguaggi imperativi




     Lo shared mutable design è quello che si adotta nei linguaggi ad
                    oggetti mainstream, Java e C#.




 Cagliari, 2011-10-22
                                                                        17
Scala e Akka
Massimiliano Dessì



                              Un altro punti di vista




                          Sulla JVM possiamo scrivere ed eseguire
                               codice in maniera differente
                        dalla programmazione ad oggetti “classica”,
              tutto sta nel pensare le soluzioni in maniera differente
                                dal design shared mutable
                                   (condiviso e mutabile)




 Cagliari, 2011-10-22
                                                                         18
Scala e Akka
Massimiliano Dessì



                        shared mutable design



    30 alunni devono scrivere sulla lavagna ciascuno la propria età
    per fare la somma, usando un solo gessetto.

    1 scrive col gessetto, 29 sono in coda, inattivi, in attesa del loro
    turno, sempre che non litighino per il gessetto.




 Cagliari, 2011-10-22
                                                                           19
Scala e Akka
Massimiliano Dessì



                        shared mutable design




    Su una risorsa contesa (il gessetto) poniamo un     lock, che ci
    assicura che una persona alla volta possa scrivere alla lavagna.
    Se i gessetti aumentano la situazione si complica perchè la
    lavagna e solo una, però prima capiterà che qualcuno toglierà il
    gesso a qualcun altro mentre stava scrivendo..




 Cagliari, 2011-10-22
                                                                       20
Scala e Akka
Massimiliano Dessì



                        isolated mutable design




                     Sulla lavagna scrivo il mio numero di cellulare

                          30 alunni mandano un messaggio

         Il gestore mi recapiterà sul telefono una coda di messaggi in
                          ordine di arrivo e io faro la somma.




 Cagliari, 2011-10-22
                                                                         21
Scala e Akka
Massimiliano Dessì



                            isolated mutable design




                     Per ricevere, possiamo usare un costrutto che
                             ha una mailbox, mandando
                         in maniera concorrenziale i messaggi
        che verranno processati in maniera sequenziale dal ricevente




 Cagliari, 2011-10-22
                                                                       22
Scala e Akka
Massimiliano Dessì



                            purely immutable design




                            I 30 alunni si siedono in modo da
                                   formare una catena,
                        ciascuno ascolta da chi ha a sx un numero,
                     chi riceve aggiunge a quel numero la propria età
                               e lo dice a chi si trova a dx.




 Cagliari, 2011-10-22
                                                                        23
Scala e Akka
Massimiliano Dessì



                            purely immutable design




                            I 30 alunni si siedono in modo da
                                   formare una catena,
                        ciascuno ascolta da chi ha a sx un numero,
                     chi riceve aggiunge a quel numero la propria età
                               e lo dice a chi si trova a dx.




 Cagliari, 2011-10-22
                                                                        24
Scala e Akka
Massimiliano Dessì



                        purely immutable design




        Possiamo comporre funzioni che dato un input restituisce un
        output basato solamente sull' input senza nessun side effect.

       Un side effect è una modifica che avviene su un altro oggetto,

                        a seguito di una modifica locale.




 Cagliari, 2011-10-22
                                                                        25
Scala e Akka
Massimiliano Dessì



                        Programmazione Funzionale




          Una funzione si comporta esattamente come una funzione
                                matematica


                                    y = f(x)


           Il risultato dipende esclusivamente dai parametri di input




 Cagliari, 2011-10-22
                                                                        26
Scala e Akka
Massimiliano Dessì



                                Functional




         In un linguaggio funzionale possiamo comporre le funzioni e
        passarle anche come argomenti a metodi e ad altre funzioni.




 Cagliari, 2011-10-22
                                                                       27
Scala e Akka
Massimiliano Dessì



                                  Functional




      Una funzione non ha side effects, non modifica cioè altro codice
                     all'infuori della funzione stessa.

                           Non abbiamo stati mutabili

              perciò non abbiamo nulla da controllare per l'accesso
                                  concorrente




 Cagliari, 2011-10-22
                                                                         28
Scala e Akka
Massimiliano Dessì



                                    Functional


    Definendo una funzione e passandola come argomento possiamo
                 ad esempio definire operazioni su collezioni di dati


                        val func = ceil_           //funzione
                        Array(3.14, 1.42, 2.0).map(func)
                             // Array(4.0, 2.0, 2.0)




 Cagliari, 2011-10-22
                                                                        29
Scala e Akka
Massimiliano Dessì



                                   Functional




                               Una funzione che triplica


                        def triple =(x : Double) => 3 * x




 Cagliari, 2011-10-22
                                                            30
Scala e Akka
Massimiliano Dessì



                                 Functional



                                Somma da 1 a 10


                        val sum = fold(1 to 10, _ + _)




 Cagliari, 2011-10-22
                                                         31
Scala e Akka
Massimiliano Dessì



                                    Functional

                               Ricorsione anziché Loop




                     def listLength1(list: List[_]): Int = {
                         if (list == Nil) 0
                         else 1 + listLength1(list.tail)
                     }




 Cagliari, 2011-10-22
                                                               32
Scala e Akka
Massimiliano Dessì



                               Functional




                        val sum = fold(1 to 10, _ + _)




 Cagliari, 2011-10-22
                                                         33
Scala e Akka
Massimiliano Dessì



                                     Functional


           Una funzione viene trattata come una classe perchè lo è
                     ad esempio la funzione A => B non è altro che


                             package scala
                             trait Function1[A, B] {
                                 def apply(x: A): B
                             }




 Cagliari, 2011-10-22
                                                                     34
Scala e Akka
Massimiliano Dessì



                              Functional


     Una funzione può ricevere anche un altra funzione e diventa una
                          High Order Function


    def apply(f: Int => String, v: Int) = f(v)
    class Decorator(left: String, right: String) {
        def layout[A](x: A) = left + x.toString() + right
    }
    …
    val decorator = new Decorator("[", "]")
    println(apply(decorator.layout, 7))
    [7]


 Cagliari, 2011-10-22
                                                                       35
Scala e Akka
Massimiliano Dessì



                                         Scala



                Scala è un linguaggio ibrido, ad oggetti e funzionale

       progettato per essere scalabile utilizzando la programmazione
                           funzionale e costrutti immutabili.

                            Gira sulla Java Virtual Machine

                        ed è pienamente interoperabile con Java




 Cagliari, 2011-10-22
                                                                        36
Scala e Akka
Massimiliano Dessì



                                 Scalable




     Scala utilizza l'approccio message passing utilizzando gli actors.
         Questo approccio è stato mutato da Erlang nel 2003 quando
                                Scala è nato.




 Cagliari, 2011-10-22
                                                                          37
Scala e Akka
Massimiliano Dessì



                                      Scalable




                Scala anziché lasciare che i thread collidano sui dati
                               utilizza dei task leggeri
                        che si scambiano in maniera asincrona
                            messaggi immutabili tra loro.




 Cagliari, 2011-10-22
                                                                         38
Scala e Akka
Massimiliano Dessì



                                   Actor




     The Actor Model, which was first proposed by Carl Hewitt in 1973
             and was improved, among others, by Gul Agha .
         This model takes a different approach to concurrency, which
         should avoid the problems caused by threading and locking




 Cagliari, 2011-10-22
                                                                        39
Scala e Akka
Massimiliano Dessì



                                         Actor



                        Anzichè invocare metodi su oggetti, gli
                        Actor si scambiano messaggi immutabili,
              Ogni Actor esegue il suo task in maniera single thread
                             sui messaggi che ha ricevuto,
                           che vengono prelevati in maniera
                              sequenziale da un mailbox




 Cagliari, 2011-10-22
                                                                       40
Scala e Akka
Massimiliano Dessì



                                          Actor



                     Ogni actor è quindi sia un sender non bloccante,
              sia un ricevente che può ricevere messaggi da sender
                                   concorrenti.
         Gli actor sono disaccoppiati dai thread che sono una risorsa
                                   limitata.
       Quando un actor ha un task da eseguire viene associato ad un
                      thread per essere eseguito.




 Cagliari, 2011-10-22
                                                                        41
Scala e Akka
Massimiliano Dessì



                                             Akka



         Akka è un toolkit che fornisce delle API Scala e Java con una
                    propria implementazione degli Actors
                        per fornire scalabilità in maniera distribuita,
                          fault-tolerant su diversi nodi distribuiti,
                                su piattaforme elastic cloud.
                        Il modello di programmazione è ad eventi
                              con message passing asincrono




 Cagliari, 2011-10-22
                                                                          42
Scala e Akka
Massimiliano Dessì




Simple Concurrency & Distribution
                                                       Resilient by Design
Asynchronous and Distributed by design.
                                                       Write systems that self-heal.
High-level abstractions like Actors, Futures and STM
                                                       Remote and/or local supervisor hierarchies.




                                                         High Performance
Elastic & Decentralized
                                                         50 million msg/sec on a single machine.
Adaptive load balancing, routing,                        Small memory footprint;
partitioning and configuration-driven remoting.          ~2.7 million actors per GB of heap.



 Cagliari, 2011-10-22
                                                                                               43
Scala e Akka
Massimiliano Dessì



                                Akka Fault tolerance



                                  Se un actor va in crash
                             viene rimpiazzato da uno nuovo
                        che sarà rintracciabile allo stesso indirizzo,
                         dove i messaggi sono stati conservati in
                                        una mailbox.
       Invece in un sistema shared mutable questa funzionalità non è
                             possibile ottenerla.




 Cagliari, 2011-10-22
                                                                         44
Scala e Akka
Massimiliano Dessì



                                    Akka Scale Out



          Se aggiungiamo altri server al sistema non è un problema,
                        gli actors mandano messaggi verso indirizzi,
                non è un problema se l' indirizzo è locale o remoto.



    akka://mysystem@casamia.org:4040/user/mysystem1/node2




                     Qualsiasi Actor è raggiungibile tramite il path



 Cagliari, 2011-10-22
                                                                       45
Scala e Akka
Massimiliano Dessì



                              Akka hierachy




    L' ActorSystem, agisce come una factory per gli actor,
    configura i Message Dispatcher e le Mailbox, e crea un guardian.
    L' Actor Guardian (/user/) è il parent degli actor top level.
    Tutti gli actor figli del guardian possono creare degli altri actor
    che diventano loro figli.
    In caso di crash il parent lo sostituisce con uno nuovo.




 Cagliari, 2011-10-22
                                                                          46
Scala e Akka
Massimiliano Dessì



                              Shared state Scale Up



     In un sistema shared state anche aumentando il numero dei core
      per aumentare il numero dei thread, abbiamo sempre il collo di
         bottiglia dei locks che costringono altri thread a rimanere in
                                         attesa.

                        In un sistema X64 con uno stack di 256kb

                        possono stare 4096 thread in 1Gb di ram




 Cagliari, 2011-10-22
                                                                          47
Scala e Akka
Massimiliano Dessì



                            Akka Scale Up




     Akka invece utilizzando un sistema message passing ha bisogno
    di meno thread, gli actors usano dei dispatchers configurabili che
      si preoccupano del tipo di thread model utilizzato e processano
                                le mailbox.




 Cagliari, 2011-10-22
                                                                         48
Scala e Akka
Massimiliano Dessì



                                Akka Scale Up



         L'implementazione Akka degli actors è più leggera di quella
                                 standard Scala.

              In 1Gb di ram possono starci 2.7 Milioni di akka actors




 Cagliari, 2011-10-22
                                                                        49
Scala e Akka
Massimiliano Dessì



                                 Actor anathomy
    class McQueen extends Actor {
          ...
          def receive = {
               case Getaway(name, tickets)
                        //TODO
               case TheGreatEscape(bike, uniform)
                        //TODO write some code to sell a ticket
               case Bullit(car, gun)
                        //TODO
               case_      => log.info("received unknown message")
          }
    }


 Cagliari, 2011-10-22
                                                                    50
Scala e Akka
Massimiliano Dessì



                          Immutable message
             Una qualsiasi classe immutabile può essere un messaggio


    case class Bike(hp: Int, cc:Int)
        val motorbike = Bike(190, 1000)
        val props = Props(new RaceTrack(100, motorbike))
        val raceTrackRef = system.actorOf(props, "raceTrack")




 Cagliari, 2011-10-22
                                                                       51
Scala e Akka
Massimiliano Dessì



                                     Bang !


            Gli actors si inviano messaggi asincroni in questo modo:


                               actorRef ! msg


                             actorRef tell msg


       Gli actors non si inviano direttamente i messaggi, ma lo fanno
                              verso un indirizzo




 Cagliari, 2011-10-22
                                                                        52
Scala e Akka
Massimiliano Dessì



                          Hello world actor !
  import akka.actor.{ ActorLogging, Actor, Props, ActorSystem }

    object HelloWorld extends App {

       val system = ActorSystem("helloWorld")
       val greeter = system.actorOf(Props[Saluto],"saluto")
       greeter ! Salutando("World")
  }

      case class Salutando(chi: String)

      class Saluto extends Actor with ActorLogging {
        def receive = {
           case Salutando(who) => log.info("Hello " + chi + " Actor !")
        }
      }


  [helloWorld-akka.actor.default-dispatcher-3]
  [akka://helloWorld/user/saluto] Hello World Actor !

 Cagliari, 2011-10-22
                                                                      53
Scala e Akka
Massimiliano Dessì




                         GRAZIE PER L'ATTENZIONE
                        https://twitter.com/desmax74




 Cagliari, 2011-10-22
                                                       54
Scala e Akka
Massimiliano Dessì




                                www.scala-lang.org
                                  http://akka.io/
                     http://www.javaconcurrencyinpractice.com/




 Cagliari, 2011-10-22
                                                                 55

More Related Content

Similar to Scala linux day 2012

Sviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con GrailsSviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con GrailsAlberto Brandolini
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRSManuel Scapolan
 
Predictive Maintenance per le aziende del nord-est con Azure e IoT
Predictive Maintenance per le aziende del nord-est con Azure e IoTPredictive Maintenance per le aziende del nord-est con Azure e IoT
Predictive Maintenance per le aziende del nord-est con Azure e IoTMarco Parenzan
 
Evoluzione dei Sistemi Embedded: Verso architetture multi-core
Evoluzione dei Sistemi Embedded: Verso architetture multi-coreEvoluzione dei Sistemi Embedded: Verso architetture multi-core
Evoluzione dei Sistemi Embedded: Verso architetture multi-corePatrick Bellasi
 
Presentazione Progetto cRio
Presentazione Progetto cRioPresentazione Progetto cRio
Presentazione Progetto cRioDario Mazza
 
Anti pattern se lo conosci lo eviti
Anti pattern se lo conosci lo evitiAnti pattern se lo conosci lo eviti
Anti pattern se lo conosci lo evitiSimone Federici
 
iOS design patterns: blocks
iOS design patterns: blocksiOS design patterns: blocks
iOS design patterns: blocksAppsterdam Milan
 
iOS design patterns: blocks
iOS design patterns: blocksiOS design patterns: blocks
iOS design patterns: blocksAlessio Roberto
 
AWS CDK infrastructure is code
AWS CDK infrastructure is codeAWS CDK infrastructure is code
AWS CDK infrastructure is codeEnrico Pesce
 
MySQL Day Roma 2019 - Le architetture a microservizi e MySQL
MySQL Day Roma 2019 - Le architetture a microservizi e MySQLMySQL Day Roma 2019 - Le architetture a microservizi e MySQL
MySQL Day Roma 2019 - Le architetture a microservizi e MySQLPar-Tec S.p.A.
 
Introduzione a Ruby On Rails
Introduzione a Ruby On RailsIntroduzione a Ruby On Rails
Introduzione a Ruby On RailsLuca Mearelli
 
Automation Night (Docker)
Automation Night (Docker)Automation Night (Docker)
Automation Night (Docker)Giuliano Latini
 
Cqrs and IoT: a match made in heaven
Cqrs and IoT: a match made in heavenCqrs and IoT: a match made in heaven
Cqrs and IoT: a match made in heavenCarmine Ingaldi
 
Con Aruba, a lezione di cloud #lezione 15 - parte 1: Unified Storage, lo stor...
Con Aruba, a lezione di cloud #lezione 15 - parte 1: Unified Storage, lo stor...Con Aruba, a lezione di cloud #lezione 15 - parte 1: Unified Storage, lo stor...
Con Aruba, a lezione di cloud #lezione 15 - parte 1: Unified Storage, lo stor...Aruba S.p.A.
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateManuel Scapolan
 
Scala in pratica - Stefano Rocco (MoneyFarm)
Scala in pratica - Stefano Rocco (MoneyFarm)Scala in pratica - Stefano Rocco (MoneyFarm)
Scala in pratica - Stefano Rocco (MoneyFarm)Scala Italy
 
Docker vs Virtualizzazioni
Docker vs VirtualizzazioniDocker vs Virtualizzazioni
Docker vs VirtualizzazioniGiuliano Latini
 
Java & LEGO Mindstorms
Java & LEGO MindstormsJava & LEGO Mindstorms
Java & LEGO MindstormsStefano Sanna
 
Introduzione al Cloud - Progetto ICARO
Introduzione al Cloud - Progetto ICAROIntroduzione al Cloud - Progetto ICARO
Introduzione al Cloud - Progetto ICAROPaolo Nesi
 

Similar to Scala linux day 2012 (20)

Sviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con GrailsSviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con Grails
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRS
 
Predictive Maintenance per le aziende del nord-est con Azure e IoT
Predictive Maintenance per le aziende del nord-est con Azure e IoTPredictive Maintenance per le aziende del nord-est con Azure e IoT
Predictive Maintenance per le aziende del nord-est con Azure e IoT
 
Evoluzione dei Sistemi Embedded: Verso architetture multi-core
Evoluzione dei Sistemi Embedded: Verso architetture multi-coreEvoluzione dei Sistemi Embedded: Verso architetture multi-core
Evoluzione dei Sistemi Embedded: Verso architetture multi-core
 
Presentazione Progetto CRio
Presentazione Progetto CRioPresentazione Progetto CRio
Presentazione Progetto CRio
 
Presentazione Progetto cRio
Presentazione Progetto cRioPresentazione Progetto cRio
Presentazione Progetto cRio
 
Anti pattern se lo conosci lo eviti
Anti pattern se lo conosci lo evitiAnti pattern se lo conosci lo eviti
Anti pattern se lo conosci lo eviti
 
iOS design patterns: blocks
iOS design patterns: blocksiOS design patterns: blocks
iOS design patterns: blocks
 
iOS design patterns: blocks
iOS design patterns: blocksiOS design patterns: blocks
iOS design patterns: blocks
 
AWS CDK infrastructure is code
AWS CDK infrastructure is codeAWS CDK infrastructure is code
AWS CDK infrastructure is code
 
MySQL Day Roma 2019 - Le architetture a microservizi e MySQL
MySQL Day Roma 2019 - Le architetture a microservizi e MySQLMySQL Day Roma 2019 - Le architetture a microservizi e MySQL
MySQL Day Roma 2019 - Le architetture a microservizi e MySQL
 
Introduzione a Ruby On Rails
Introduzione a Ruby On RailsIntroduzione a Ruby On Rails
Introduzione a Ruby On Rails
 
Automation Night (Docker)
Automation Night (Docker)Automation Night (Docker)
Automation Night (Docker)
 
Cqrs and IoT: a match made in heaven
Cqrs and IoT: a match made in heavenCqrs and IoT: a match made in heaven
Cqrs and IoT: a match made in heaven
 
Con Aruba, a lezione di cloud #lezione 15 - parte 1: Unified Storage, lo stor...
Con Aruba, a lezione di cloud #lezione 15 - parte 1: Unified Storage, lo stor...Con Aruba, a lezione di cloud #lezione 15 - parte 1: Unified Storage, lo stor...
Con Aruba, a lezione di cloud #lezione 15 - parte 1: Unified Storage, lo stor...
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernate
 
Scala in pratica - Stefano Rocco (MoneyFarm)
Scala in pratica - Stefano Rocco (MoneyFarm)Scala in pratica - Stefano Rocco (MoneyFarm)
Scala in pratica - Stefano Rocco (MoneyFarm)
 
Docker vs Virtualizzazioni
Docker vs VirtualizzazioniDocker vs Virtualizzazioni
Docker vs Virtualizzazioni
 
Java & LEGO Mindstorms
Java & LEGO MindstormsJava & LEGO Mindstorms
Java & LEGO Mindstorms
 
Introduzione al Cloud - Progetto ICARO
Introduzione al Cloud - Progetto ICAROIntroduzione al Cloud - Progetto ICARO
Introduzione al Cloud - Progetto ICARO
 

More from Massimiliano Dessì

When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...Massimiliano Dessì
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Massimiliano Dessì
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudMassimiliano Dessì
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineMassimiliano Dessì
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMMassimiliano Dessì
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Massimiliano Dessì
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCMassimiliano Dessì
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayMassimiliano Dessì
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutesMassimiliano Dessì
 
Jaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesJaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesMassimiliano Dessì
 

More from Massimiliano Dessì (20)

Code One 2018 maven
Code One 2018   mavenCode One 2018   maven
Code One 2018 maven
 
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
 
Hacking Maven Linux day 2017
Hacking Maven Linux day 2017Hacking Maven Linux day 2017
Hacking Maven Linux day 2017
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloud
 
Docker dDessi november 2015
Docker dDessi november 2015Docker dDessi november 2015
Docker dDessi november 2015
 
Docker linuxday 2015
Docker linuxday 2015Docker linuxday 2015
Docker linuxday 2015
 
Openshift linuxday 2014
Openshift linuxday 2014Openshift linuxday 2014
Openshift linuxday 2014
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community Online
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVM
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVC
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_spray
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutes
 
MongoDB dessi-codemotion
MongoDB dessi-codemotionMongoDB dessi-codemotion
MongoDB dessi-codemotion
 
MongoDB Webtech conference 2010
MongoDB Webtech conference 2010MongoDB Webtech conference 2010
MongoDB Webtech conference 2010
 
RESTEasy
RESTEasyRESTEasy
RESTEasy
 
Spring Roo Internals Javaday IV
Spring Roo Internals Javaday IVSpring Roo Internals Javaday IV
Spring Roo Internals Javaday IV
 
Spring Roo JaxItalia09
Spring Roo JaxItalia09Spring Roo JaxItalia09
Spring Roo JaxItalia09
 
Jaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesJaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best Practices
 

Scala linux day 2012

  • 1. Scala e Akka Massimiliano Dessì Scala e Akka Programmazione Funzionale per architetture scalabili multicore, distribuite e su cloud Massimiliano Dessì GULCh Cagliari, 2011-10-22 1
  • 2. Scala e Akka Massimiliano Dessì Speaker Dad of three Co-fondatore e Presidente Java UG Sardegna (http://www.jugsardegna.org) Fondatore Google Technology UG Sardegna ((http://sardegna.gtugs.org) Coordinatore SpringFramework UG Italia Software Architect/Senior Engineer Energeya ((http://www.energeya.com) Autore di “Spring 2.5 Aspect Oriented Programming” (http://www.packtpub.com/aspect-oriented-programming-with-spring-2-5/book) Cagliari, 2011-10-22 2
  • 3. Scala e Akka Massimiliano Dessì Legge di Moore Anni fa i processori eseguivano le istruzioni sequenzialmente . I miglioramenti della tecnologia hanno aumentato il numero di operazioni per unita di tempo aumentando i transistor. Cagliari, 2011-10-22 3
  • 4. Scala e Akka Massimiliano Dessì Legge di Amdahl Da qualche anno aumenta il numero di core "Il miglioramento che si può ottenere su una certa parte del sistema è limitato dalla frazione di tempo in cui tale attività ha luogo", "Make the common case fast" Cagliari, 2011-10-22 4
  • 5. Scala e Akka Massimiliano Dessì Multithread La CPU simula delle esecuzioni contemporanee del software con delle pause e dei cambiamenti di contesto nei propri registri. In alcuni sistemi come la Java Virtual Machine, vengono eseguiti algoritmi di ottimizzazione del codice compilato eseguendo anche il riordinamento delle operazioni. Cagliari, 2011-10-22 5
  • 6. Scala e Akka Massimiliano Dessì “Houston abbiamo un problema” Per decenni sono state scritte applicazioni pensate per essere eseguite in maniera strettamente sequenziale (sequential consistency). Oggi le applicazioni sono eseguite su processori multi core in maniera parallela e concorrente per avere migliori performance. Cagliari, 2011-10-22 6
  • 7. Scala e Akka Massimiliano Dessì “Skywalker usa la forza che è in te” Dobbiamo pensare e scrivere il codice immaginando che possa essere eseguito senza vincoli di ordine, contemporaneamente su n-thread di esecuzione e su core diversi Cagliari, 2011-10-22 7
  • 8. Scala e Akka Massimiliano Dessì Mutable il lato oscuro della forza Il problema nasce dalla natura mutabile dei costrutti utilizzati. Dati contenuti in una struttura mutabile devono essere sincronizzati in lettura e scrittura affinchè due o più thread possano operare nella maniera corretta affinchè i dati siano sempre in uno stato congruente per ogni thread che deve operare su di essi, ma sopratutto perchè i dati scritti da un thread siano visibili agli altri. Cagliari, 2011-10-22 8
  • 9. Scala e Akka Massimiliano Dessì Passa la cera, togli la cera Ogni volta che la cpu assegna uno slot di esecuzione ad un thread deve ripristinare il contesto per eseguirlo. Se in questo slot il thread deve mettersi a sincronizzare gli accessi sui dati contenuti nei registri stiamo semplicemente sprecando cicli di clock. Cagliari, 2011-10-22 9
  • 10. Scala e Akka Massimiliano Dessì No Panic..... D'altra parte, se le parti di codice con accesso concorrente non sono ben scritte possiamo avere dei comportamenti imprevedibili oppure possiamo avere l'illusione che il codice funzioni, ma questo solo per pura fortuna. Cagliari, 2011-10-22 10
  • 11. Scala e Akka Massimiliano Dessì Legge di Murphy Semplicemente non si deve scrivere il codice pensando che alcune situazioni non avverranno. Scommettere sulle combinazioni delle chiamate con miliardi di operazioni al secondo non si può definire meno che folle. Cagliari, 2011-10-22 11
  • 12. Scala e Akka Massimiliano Dessì Legge di Murphy II Sfortunatamente non si può testare il codice per riprodurre il modo in cui verrà chiamato da più thread, tantomeno con un ordine preciso Cagliari, 2011-10-22 12
  • 13. Scala e Akka Massimiliano Dessì Java Memory Model Le uniche certezze che abbiamo sono su cosa viene eseguito prima di qualcos'altro, in base alle regole happens before del Java memory model (JSR-133) Cagliari, 2011-10-22 13
  • 14. Scala e Akka Massimiliano Dessì Immutable Oggetti immutabili possono invece essere condivisi tra più thread perchè nessuno potrà operare modifiche su di essi. Strutture dati immutabili, cioè create nuove (in maniera opportuna e non dispendiosa) per ciascuna modifica, sono ugualmente condivisibili senza necessità di lock su di esse. Cagliari, 2011-10-22 14
  • 15. Scala e Akka Massimiliano Dessì Linguaggi imperativi Il software eseguito dalle CPU, scritto con linguaggi imperativi come C, C++, Java, C# fornisce delle astrazioni per descrive cosa deve essere eseguito. In alcune situazioni tramite un linguaggio imperativo dobbiamo condividere delle strutture dati con altri thread di esecuzione del nostro codice. Cagliari, 2011-10-22 15
  • 16. Scala e Akka Massimiliano Dessì Linguaggi imperativi Dobbiamo quindi preoccuparci di gestire correttamente l'accesso concorrente dei diversi thread. Dobbiamo stare attenti a dettagli di basso livello. Possiamo fare errori molto facilmente. Dobbiamo gestire dei data races. Lock, Latch, Barrier, semaphores Cagliari, 2011-10-22 16
  • 17. Scala e Akka Massimiliano Dessì Linguaggi imperativi Lo shared mutable design è quello che si adotta nei linguaggi ad oggetti mainstream, Java e C#. Cagliari, 2011-10-22 17
  • 18. Scala e Akka Massimiliano Dessì Un altro punti di vista Sulla JVM possiamo scrivere ed eseguire codice in maniera differente dalla programmazione ad oggetti “classica”, tutto sta nel pensare le soluzioni in maniera differente dal design shared mutable (condiviso e mutabile) Cagliari, 2011-10-22 18
  • 19. Scala e Akka Massimiliano Dessì shared mutable design 30 alunni devono scrivere sulla lavagna ciascuno la propria età per fare la somma, usando un solo gessetto. 1 scrive col gessetto, 29 sono in coda, inattivi, in attesa del loro turno, sempre che non litighino per il gessetto. Cagliari, 2011-10-22 19
  • 20. Scala e Akka Massimiliano Dessì shared mutable design Su una risorsa contesa (il gessetto) poniamo un lock, che ci assicura che una persona alla volta possa scrivere alla lavagna. Se i gessetti aumentano la situazione si complica perchè la lavagna e solo una, però prima capiterà che qualcuno toglierà il gesso a qualcun altro mentre stava scrivendo.. Cagliari, 2011-10-22 20
  • 21. Scala e Akka Massimiliano Dessì isolated mutable design Sulla lavagna scrivo il mio numero di cellulare 30 alunni mandano un messaggio Il gestore mi recapiterà sul telefono una coda di messaggi in ordine di arrivo e io faro la somma. Cagliari, 2011-10-22 21
  • 22. Scala e Akka Massimiliano Dessì isolated mutable design Per ricevere, possiamo usare un costrutto che ha una mailbox, mandando in maniera concorrenziale i messaggi che verranno processati in maniera sequenziale dal ricevente Cagliari, 2011-10-22 22
  • 23. Scala e Akka Massimiliano Dessì purely immutable design I 30 alunni si siedono in modo da formare una catena, ciascuno ascolta da chi ha a sx un numero, chi riceve aggiunge a quel numero la propria età e lo dice a chi si trova a dx. Cagliari, 2011-10-22 23
  • 24. Scala e Akka Massimiliano Dessì purely immutable design I 30 alunni si siedono in modo da formare una catena, ciascuno ascolta da chi ha a sx un numero, chi riceve aggiunge a quel numero la propria età e lo dice a chi si trova a dx. Cagliari, 2011-10-22 24
  • 25. Scala e Akka Massimiliano Dessì purely immutable design Possiamo comporre funzioni che dato un input restituisce un output basato solamente sull' input senza nessun side effect. Un side effect è una modifica che avviene su un altro oggetto, a seguito di una modifica locale. Cagliari, 2011-10-22 25
  • 26. Scala e Akka Massimiliano Dessì Programmazione Funzionale Una funzione si comporta esattamente come una funzione matematica y = f(x) Il risultato dipende esclusivamente dai parametri di input Cagliari, 2011-10-22 26
  • 27. Scala e Akka Massimiliano Dessì Functional In un linguaggio funzionale possiamo comporre le funzioni e passarle anche come argomenti a metodi e ad altre funzioni. Cagliari, 2011-10-22 27
  • 28. Scala e Akka Massimiliano Dessì Functional Una funzione non ha side effects, non modifica cioè altro codice all'infuori della funzione stessa. Non abbiamo stati mutabili perciò non abbiamo nulla da controllare per l'accesso concorrente Cagliari, 2011-10-22 28
  • 29. Scala e Akka Massimiliano Dessì Functional Definendo una funzione e passandola come argomento possiamo ad esempio definire operazioni su collezioni di dati val func = ceil_ //funzione Array(3.14, 1.42, 2.0).map(func) // Array(4.0, 2.0, 2.0) Cagliari, 2011-10-22 29
  • 30. Scala e Akka Massimiliano Dessì Functional Una funzione che triplica def triple =(x : Double) => 3 * x Cagliari, 2011-10-22 30
  • 31. Scala e Akka Massimiliano Dessì Functional Somma da 1 a 10 val sum = fold(1 to 10, _ + _) Cagliari, 2011-10-22 31
  • 32. Scala e Akka Massimiliano Dessì Functional Ricorsione anziché Loop def listLength1(list: List[_]): Int = { if (list == Nil) 0 else 1 + listLength1(list.tail) } Cagliari, 2011-10-22 32
  • 33. Scala e Akka Massimiliano Dessì Functional val sum = fold(1 to 10, _ + _) Cagliari, 2011-10-22 33
  • 34. Scala e Akka Massimiliano Dessì Functional Una funzione viene trattata come una classe perchè lo è ad esempio la funzione A => B non è altro che package scala trait Function1[A, B] { def apply(x: A): B } Cagliari, 2011-10-22 34
  • 35. Scala e Akka Massimiliano Dessì Functional Una funzione può ricevere anche un altra funzione e diventa una High Order Function def apply(f: Int => String, v: Int) = f(v) class Decorator(left: String, right: String) { def layout[A](x: A) = left + x.toString() + right } … val decorator = new Decorator("[", "]") println(apply(decorator.layout, 7)) [7] Cagliari, 2011-10-22 35
  • 36. Scala e Akka Massimiliano Dessì Scala Scala è un linguaggio ibrido, ad oggetti e funzionale progettato per essere scalabile utilizzando la programmazione funzionale e costrutti immutabili. Gira sulla Java Virtual Machine ed è pienamente interoperabile con Java Cagliari, 2011-10-22 36
  • 37. Scala e Akka Massimiliano Dessì Scalable Scala utilizza l'approccio message passing utilizzando gli actors. Questo approccio è stato mutato da Erlang nel 2003 quando Scala è nato. Cagliari, 2011-10-22 37
  • 38. Scala e Akka Massimiliano Dessì Scalable Scala anziché lasciare che i thread collidano sui dati utilizza dei task leggeri che si scambiano in maniera asincrona messaggi immutabili tra loro. Cagliari, 2011-10-22 38
  • 39. Scala e Akka Massimiliano Dessì Actor The Actor Model, which was first proposed by Carl Hewitt in 1973 and was improved, among others, by Gul Agha . This model takes a different approach to concurrency, which should avoid the problems caused by threading and locking Cagliari, 2011-10-22 39
  • 40. Scala e Akka Massimiliano Dessì Actor Anzichè invocare metodi su oggetti, gli Actor si scambiano messaggi immutabili, Ogni Actor esegue il suo task in maniera single thread sui messaggi che ha ricevuto, che vengono prelevati in maniera sequenziale da un mailbox Cagliari, 2011-10-22 40
  • 41. Scala e Akka Massimiliano Dessì Actor Ogni actor è quindi sia un sender non bloccante, sia un ricevente che può ricevere messaggi da sender concorrenti. Gli actor sono disaccoppiati dai thread che sono una risorsa limitata. Quando un actor ha un task da eseguire viene associato ad un thread per essere eseguito. Cagliari, 2011-10-22 41
  • 42. Scala e Akka Massimiliano Dessì Akka Akka è un toolkit che fornisce delle API Scala e Java con una propria implementazione degli Actors per fornire scalabilità in maniera distribuita, fault-tolerant su diversi nodi distribuiti, su piattaforme elastic cloud. Il modello di programmazione è ad eventi con message passing asincrono Cagliari, 2011-10-22 42
  • 43. Scala e Akka Massimiliano Dessì Simple Concurrency & Distribution Resilient by Design Asynchronous and Distributed by design. Write systems that self-heal. High-level abstractions like Actors, Futures and STM Remote and/or local supervisor hierarchies. High Performance Elastic & Decentralized 50 million msg/sec on a single machine. Adaptive load balancing, routing, Small memory footprint; partitioning and configuration-driven remoting. ~2.7 million actors per GB of heap. Cagliari, 2011-10-22 43
  • 44. Scala e Akka Massimiliano Dessì Akka Fault tolerance Se un actor va in crash viene rimpiazzato da uno nuovo che sarà rintracciabile allo stesso indirizzo, dove i messaggi sono stati conservati in una mailbox. Invece in un sistema shared mutable questa funzionalità non è possibile ottenerla. Cagliari, 2011-10-22 44
  • 45. Scala e Akka Massimiliano Dessì Akka Scale Out Se aggiungiamo altri server al sistema non è un problema, gli actors mandano messaggi verso indirizzi, non è un problema se l' indirizzo è locale o remoto. akka://mysystem@casamia.org:4040/user/mysystem1/node2 Qualsiasi Actor è raggiungibile tramite il path Cagliari, 2011-10-22 45
  • 46. Scala e Akka Massimiliano Dessì Akka hierachy L' ActorSystem, agisce come una factory per gli actor, configura i Message Dispatcher e le Mailbox, e crea un guardian. L' Actor Guardian (/user/) è il parent degli actor top level. Tutti gli actor figli del guardian possono creare degli altri actor che diventano loro figli. In caso di crash il parent lo sostituisce con uno nuovo. Cagliari, 2011-10-22 46
  • 47. Scala e Akka Massimiliano Dessì Shared state Scale Up In un sistema shared state anche aumentando il numero dei core per aumentare il numero dei thread, abbiamo sempre il collo di bottiglia dei locks che costringono altri thread a rimanere in attesa. In un sistema X64 con uno stack di 256kb possono stare 4096 thread in 1Gb di ram Cagliari, 2011-10-22 47
  • 48. Scala e Akka Massimiliano Dessì Akka Scale Up Akka invece utilizzando un sistema message passing ha bisogno di meno thread, gli actors usano dei dispatchers configurabili che si preoccupano del tipo di thread model utilizzato e processano le mailbox. Cagliari, 2011-10-22 48
  • 49. Scala e Akka Massimiliano Dessì Akka Scale Up L'implementazione Akka degli actors è più leggera di quella standard Scala. In 1Gb di ram possono starci 2.7 Milioni di akka actors Cagliari, 2011-10-22 49
  • 50. Scala e Akka Massimiliano Dessì Actor anathomy class McQueen extends Actor { ... def receive = { case Getaway(name, tickets) //TODO case TheGreatEscape(bike, uniform) //TODO write some code to sell a ticket case Bullit(car, gun) //TODO case_ => log.info("received unknown message") } } Cagliari, 2011-10-22 50
  • 51. Scala e Akka Massimiliano Dessì Immutable message Una qualsiasi classe immutabile può essere un messaggio case class Bike(hp: Int, cc:Int) val motorbike = Bike(190, 1000) val props = Props(new RaceTrack(100, motorbike)) val raceTrackRef = system.actorOf(props, "raceTrack") Cagliari, 2011-10-22 51
  • 52. Scala e Akka Massimiliano Dessì Bang ! Gli actors si inviano messaggi asincroni in questo modo: actorRef ! msg actorRef tell msg Gli actors non si inviano direttamente i messaggi, ma lo fanno verso un indirizzo Cagliari, 2011-10-22 52
  • 53. Scala e Akka Massimiliano Dessì Hello world actor ! import akka.actor.{ ActorLogging, Actor, Props, ActorSystem } object HelloWorld extends App { val system = ActorSystem("helloWorld") val greeter = system.actorOf(Props[Saluto],"saluto") greeter ! Salutando("World") } case class Salutando(chi: String) class Saluto extends Actor with ActorLogging { def receive = { case Salutando(who) => log.info("Hello " + chi + " Actor !") } } [helloWorld-akka.actor.default-dispatcher-3] [akka://helloWorld/user/saluto] Hello World Actor ! Cagliari, 2011-10-22 53
  • 54. Scala e Akka Massimiliano Dessì GRAZIE PER L'ATTENZIONE https://twitter.com/desmax74 Cagliari, 2011-10-22 54
  • 55. Scala e Akka Massimiliano Dessì www.scala-lang.org http://akka.io/ http://www.javaconcurrencyinpractice.com/ Cagliari, 2011-10-22 55