Your SlideShare is downloading. ×
0
Scala e AkkaMassimiliano Dessì                       Scala e Akka              Programmazione Funzionale                pe...
Scala e AkkaMassimiliano Dessì    Speaker        Dad of three        Co-fondatore e Presidente Java UG Sardegna           ...
Scala e AkkaMassimiliano Dessì    Legge di Moore    Anni fa i processori eseguivano le istruzioni sequenzialmente .    I m...
Scala e AkkaMassimiliano Dessì    Legge di Amdahl    Da qualche anno aumenta il numero di core    "Il miglioramento che si...
Scala e AkkaMassimiliano Dessì    Multithread     La CPU simula delle esecuzioni contemporanee del software con        del...
Scala e AkkaMassimiliano Dessì    “Houston abbiamo un problema”       Per decenni sono state scritte applicazioni pensate ...
Scala e AkkaMassimiliano Dessì    “Skywalker usa la forza che è in te”                        Dobbiamo pensare e scrivere ...
Scala e AkkaMassimiliano Dessì    Mutable il lato oscuro della forza       Il problema nasce dalla natura mutabile dei cos...
Scala e AkkaMassimiliano Dessì    Passa la cera, togli la cera          Ogni volta che la cpu assegna uno slot di esecuzio...
Scala e AkkaMassimiliano Dessì    No Panic.....      Daltra parte, se le parti di codice con accesso concorrente non      ...
Scala e AkkaMassimiliano Dessì    Legge di Murphy         Semplicemente non si deve scrivere il codice pensando che       ...
Scala e AkkaMassimiliano Dessì    Legge di Murphy II                          Sfortunatamente non si può                  ...
Scala e AkkaMassimiliano Dessì    Java Memory Model                         Le uniche certezze che abbiamo sono su        ...
Scala e AkkaMassimiliano Dessì     Immutable          Oggetti immutabili possono invece essere condivisi tra più          ...
Scala e AkkaMassimiliano Dessì    Linguaggi imperativi       Il software eseguito dalle CPU, scritto con linguaggi imperat...
Scala e AkkaMassimiliano Dessì                              Linguaggi imperativi     Dobbiamo quindi preoccuparci di gesti...
Scala e AkkaMassimiliano Dessì                        Linguaggi imperativi     Lo shared mutable design è quello che si ad...
Scala e AkkaMassimiliano Dessì                              Un altro punti di vista                          Sulla JVM pos...
Scala e AkkaMassimiliano Dessì                        shared mutable design    30 alunni devono scrivere sulla lavagna cia...
Scala e AkkaMassimiliano Dessì                        shared mutable design    Su una risorsa contesa (il gessetto) poniam...
Scala e AkkaMassimiliano Dessì                        isolated mutable design                     Sulla lavagna scrivo il ...
Scala e AkkaMassimiliano Dessì                            isolated mutable design                     Per ricevere, possia...
Scala e AkkaMassimiliano Dessì                            purely immutable design                            I 30 alunni s...
Scala e AkkaMassimiliano Dessì                            purely immutable design                            I 30 alunni s...
Scala e AkkaMassimiliano Dessì                        purely immutable design        Possiamo comporre funzioni che dato u...
Scala e AkkaMassimiliano Dessì                        Programmazione Funzionale          Una funzione si comporta esattame...
Scala e AkkaMassimiliano Dessì                                Functional         In un linguaggio funzionale possiamo comp...
Scala e AkkaMassimiliano Dessì                                  Functional      Una funzione non ha side effects, non modi...
Scala e AkkaMassimiliano Dessì                                    Functional    Definendo una funzione e passandola come a...
Scala e AkkaMassimiliano Dessì                                   Functional                               Una funzione che...
Scala e AkkaMassimiliano Dessì                                 Functional                                Somma da 1 a 10  ...
Scala e AkkaMassimiliano Dessì                                    Functional                               Ricorsione anzi...
Scala e AkkaMassimiliano Dessì                               Functional                        val sum = fold(1 to 10, _ +...
Scala e AkkaMassimiliano Dessì                                     Functional           Una funzione viene trattata come u...
Scala e AkkaMassimiliano Dessì                              Functional     Una funzione può ricevere anche un altra funzio...
Scala e AkkaMassimiliano Dessì                                         Scala                Scala è un linguaggio ibrido, ...
Scala e AkkaMassimiliano Dessì                                 Scalable     Scala utilizza lapproccio message passing util...
Scala e AkkaMassimiliano Dessì                                      Scalable                Scala anziché lasciare che i t...
Scala e AkkaMassimiliano Dessì                                   Actor     The Actor Model, which was first proposed by Ca...
Scala e AkkaMassimiliano Dessì                                         Actor                        Anzichè invocare metod...
Scala e AkkaMassimiliano Dessì                                          Actor                     Ogni actor è quindi sia ...
Scala e AkkaMassimiliano Dessì                                             Akka         Akka è un toolkit che fornisce del...
Scala e AkkaMassimiliano DessìSimple Concurrency & Distribution                                                       Resi...
Scala e AkkaMassimiliano Dessì                                Akka Fault tolerance                                  Se un ...
Scala e AkkaMassimiliano Dessì                                    Akka Scale Out          Se aggiungiamo altri server al s...
Scala e AkkaMassimiliano Dessì                              Akka hierachy    L ActorSystem, agisce come una factory per gl...
Scala e AkkaMassimiliano Dessì                              Shared state Scale Up     In un sistema shared state anche aum...
Scala e AkkaMassimiliano Dessì                            Akka Scale Up     Akka invece utilizzando un sistema message pas...
Scala e AkkaMassimiliano Dessì                                Akka Scale Up         Limplementazione Akka degli actors è p...
Scala e AkkaMassimiliano Dessì                                 Actor anathomy    class McQueen extends Actor {          .....
Scala e AkkaMassimiliano Dessì                          Immutable message             Una qualsiasi classe immutabile può ...
Scala e AkkaMassimiliano Dessì                                     Bang !            Gli actors si inviano messaggi asincr...
Scala e AkkaMassimiliano Dessì                          Hello world actor !  import akka.actor.{ ActorLogging, Actor, Prop...
Scala e AkkaMassimiliano Dessì                         GRAZIE PER LATTENZIONE                        https://twitter.com/d...
Scala e AkkaMassimiliano Dessì                                www.scala-lang.org                                  http://a...
Upcoming SlideShare
Loading in...5
×

Scala linux day 2012

1,505

Published on

Scala and Akka Linux day 2012 Cagliari Gulch

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,505
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
17
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "Scala linux day 2012 "

  1. 1. Scala e AkkaMassimiliano Dessì Scala e Akka Programmazione Funzionale per architetture scalabili multicore, distribuite e su cloud Massimiliano Dessì GULCh Cagliari, 2011-10-22 1
  2. 2. Scala e AkkaMassimiliano 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. 3. Scala e AkkaMassimiliano 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. 4. Scala e AkkaMassimiliano 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. 5. Scala e AkkaMassimiliano 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. 6. Scala e AkkaMassimiliano 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. 7. Scala e AkkaMassimiliano 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. 8. Scala e AkkaMassimiliano 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. 9. Scala e AkkaMassimiliano 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. 10. Scala e AkkaMassimiliano Dessì No Panic..... Daltra parte, se le parti di codice con accesso concorrente non sono ben scritte possiamo avere dei comportamenti imprevedibili oppure possiamo avere lillusione che il codice funzioni, ma questo solo per pura fortuna. Cagliari, 2011-10-22 10
  11. 11. Scala e AkkaMassimiliano 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. 12. Scala e AkkaMassimiliano 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. 13. Scala e AkkaMassimiliano Dessì Java Memory Model Le uniche certezze che abbiamo sono su cosa viene eseguito prima di qualcosaltro, in base alle regole happens before del Java memory model (JSR-133) Cagliari, 2011-10-22 13
  14. 14. Scala e AkkaMassimiliano 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. 15. Scala e AkkaMassimiliano 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. 16. Scala e AkkaMassimiliano Dessì Linguaggi imperativi Dobbiamo quindi preoccuparci di gestire correttamente laccesso 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. 17. Scala e AkkaMassimiliano 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. 18. Scala e AkkaMassimiliano 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. 19. Scala e AkkaMassimiliano 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. 20. Scala e AkkaMassimiliano 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. 21. Scala e AkkaMassimiliano 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. 22. Scala e AkkaMassimiliano 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. 23. Scala e AkkaMassimiliano 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. 24. Scala e AkkaMassimiliano 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. 25. Scala e AkkaMassimiliano 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. 26. Scala e AkkaMassimiliano 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. 27. Scala e AkkaMassimiliano 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. 28. Scala e AkkaMassimiliano Dessì Functional Una funzione non ha side effects, non modifica cioè altro codice allinfuori della funzione stessa. Non abbiamo stati mutabili perciò non abbiamo nulla da controllare per laccesso concorrente Cagliari, 2011-10-22 28
  29. 29. Scala e AkkaMassimiliano 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. 30. Scala e AkkaMassimiliano Dessì Functional Una funzione che triplica def triple =(x : Double) => 3 * x Cagliari, 2011-10-22 30
  31. 31. Scala e AkkaMassimiliano Dessì Functional Somma da 1 a 10 val sum = fold(1 to 10, _ + _) Cagliari, 2011-10-22 31
  32. 32. Scala e AkkaMassimiliano 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. 33. Scala e AkkaMassimiliano Dessì Functional val sum = fold(1 to 10, _ + _) Cagliari, 2011-10-22 33
  34. 34. Scala e AkkaMassimiliano 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. 35. Scala e AkkaMassimiliano 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. 36. Scala e AkkaMassimiliano 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. 37. Scala e AkkaMassimiliano Dessì Scalable Scala utilizza lapproccio message passing utilizzando gli actors. Questo approccio è stato mutato da Erlang nel 2003 quando Scala è nato. Cagliari, 2011-10-22 37
  38. 38. Scala e AkkaMassimiliano 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. 39. Scala e AkkaMassimiliano 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. 40. Scala e AkkaMassimiliano 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. 41. Scala e AkkaMassimiliano 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. 42. Scala e AkkaMassimiliano 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. 43. Scala e AkkaMassimiliano DessìSimple Concurrency & Distribution Resilient by DesignAsynchronous and Distributed by design. Write systems that self-heal.High-level abstractions like Actors, Futures and STM Remote and/or local supervisor hierarchies. High PerformanceElastic & 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. 44. Scala e AkkaMassimiliano 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. 45. Scala e AkkaMassimiliano 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. 46. Scala e AkkaMassimiliano 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. 47. Scala e AkkaMassimiliano 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. 48. Scala e AkkaMassimiliano 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. 49. Scala e AkkaMassimiliano Dessì Akka Scale Up Limplementazione 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. 50. Scala e AkkaMassimiliano 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. 51. Scala e AkkaMassimiliano 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. 52. Scala e AkkaMassimiliano 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. 53. Scala e AkkaMassimiliano 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. 54. Scala e AkkaMassimiliano Dessì GRAZIE PER LATTENZIONE https://twitter.com/desmax74 Cagliari, 2011-10-22 54
  55. 55. Scala e AkkaMassimiliano Dessì www.scala-lang.org http://akka.io/ http://www.javaconcurrencyinpractice.com/ Cagliari, 2011-10-22 55
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×