Slide dal primo Scala Treviso Meetup del 25/06/2015. Lo studio di un caso reale per valutare i pro ed i contro dell'uso di Scala nella pratica di tutti i giorni.
Panorama necto, la business intelligence collaborativa mr v02
Scala ed Rx in pratica
1. Scala ed Rx
in pratica
Michele Mauro
@michelemauro
Scala Treviso Meetup
25/06/2015
2. WARDA - Fashion Digitalization
Chi vi parla...
CTO @ Visionest
Scientist @ Warda
Risolvo problemi
3. WARDA è la piattaforma software che mette ordine
al MEDIA CHAOS mediante specifiche applicazioni che
coprono le esigenze in tutte le fasi dell’azienda
Style & ProductStyle & Product
Board
digital technology
Board
digital technologyVisual & RetailVisual & Retail
E-CommerceE-Commerce
Marketing & SocialMarketing & Social
4. WARDA - Fashion Digitalization
Di cosa vi parlo
Scala applicato ad un problema diverso
dalla “solita„ applicazione web o Big Data
https://www.flickr.com/photos/photosdavidgabrielfischer/13990127367
5. WARDA - Fashion Digitalization
Problema
Archivio storico
80k file
1.2TB
DAMHTTP
Velocemente
Senza intervento manuale
Tracciando quanto eseguito
6. WARDA - Fashion Digitalization
Prima analisi
Attraversamento di un albero
di dimensione e cardinalità
ignota
La visita restituisce un
risultato ed i nodi del livello
successivo
7. WARDA - Fashion Digitalization
Future[T]
Un Future[T] diventerà un valore in futuro
La sua elaborazione può iniziare in qualsiasi momento
Future#get blocca fino al completamento
Future#isCompleted è vero quando il valore è
disponibile
8. WARDA - Fashion Digitalization
“Velocemente„
Con Future[T] gestiamo le operazioni di lunga
durata; e non dobbiamo più preoccuparci della
concorrenza.
type ResultRest[R] =
(TreeResult[R], List[TreeAction[R]])
type FutureResultRest[R] =
Future[ResultRest[R]]
9. WARDA - Fashion Digitalization
Il tipo dei dati
Tipo di dato
Documentazione Lessico
Istruzione Materia prima
Uno dei vantaggi più accessibili di Scala è la facilità con
cui è possibile maneggiare, costruire, e descrivere tipi.
10. WARDA - Fashion Digitalization
“Velocemente„
def buildFuture(
arg: TreeAction[R],
subscriber: Subscriber[TreeEvent[R]]):
FutureResultRest[R]
def select[A](
fs: Seq[Future[A]])
(implicit ec: ExecutionContext):
Future[(Try[A], Seq[Future[A]])]
Grazie a Viktor Klang: https://gist.github.com/4488970
11. WARDA - Fashion Digitalization
“Velocemente„
● Il numero di thread è un facile parametro
sull'ExecutionContext
● La condizione di termine è che la coda sia vuota, cioè
che select() ritorni (Success[A], Seq())
12. WARDA - Fashion Digitalization
“Velocemente„
def run(current: Seq[FutureResultRest[R]],
subscriber: Subscriber[TreeEvent[R]]): Unit = {
select(current) onSuccess {
case (done: Try[ResultRest[R]],
rest: Seq[FutureResultRest[R]]) =>
val result = done.get
val remaining = rest ++ result._2.map({ action =>
subscriber.onNext(TreeActionQueue(action))
action
}).map(buildFuture(_, subscriber))
if (remaining.isEmpty)
executionContext.shutdown()
else run(remaining, subscriber)
}
}
13. WARDA - Fashion Digitalization
Il tipo dei dati
When Scala came out,
Static Typing was dead
Martin Odersky, Scala Italy Milan 08/05/2015
Image by Marco Firrincieli https://plus.google.com/photos/112206187111185023340/albums/6162489666224189969
14. WARDA - Fashion Digitalization
“Una traccia di quanto eseguito„
● Come contare e sommare risultati che arrivano
contemporaneamente da più thread?
● E nel frattempo annotare le operazioni eseguite?
15. WARDA - Fashion Digitalization
ReactiveX
“An API for asynchronous
programming with
observable streams„
Semantica standardizzata
e accuratamente definita
“The Observer pattern
done right„
reactivex.io
introtorx.com
17. WARDA - Fashion Digitalization
“Una traccia di quanto eseguito„
Il nostro esecutore è un Observable. Ne ricaviamo un
ConnectableObservable, in modo da poterci collegare
più Subscribers:
val walker = TreeWalker[SyncDone]
(config.threads).traverse(List(root)).publish
18. WARDA - Fashion Digitalization
“Una traccia di quanto eseguito„
walker.subscribe(_ match {
case TreeActionEnd(
TreeResult(source, SyncDone(...), _), _) =>
localLog.println(f"...")
case _ => Nil })
var files = 0L
doneResults.map(s => 1)
.sum.subscribe(files = _)
var bytes = 0L
doneResults.map(_.bytes)
.sum.subscribe(bytes = _)
19. WARDA - Fashion Digitalization
“Una traccia di quanto eseguito„
walker.connect
20. WARDA - Fashion Digitalization
Risultati
Problema risolto
Ottima interazione con Java
Codice riutilizzabile
Multithreading semplice
21. WARDA - Fashion Digitalization
Punti critici
Tempi di compilazione
Ecosistema giovane
Inversione della prospettiva