Scala ed Rx in pratica

26
Scala ed Rx in pratica Michele Mauro @michelemauro Scala Treviso Meetup 25/06/2015

Transcript of Scala ed Rx in pratica

Page 1: Scala ed Rx in pratica

Scala ed Rx in pratica

Michele Mauro@michelemauro

Scala Treviso Meetup25/06/2015

Page 2: Scala ed Rx in pratica

WARDA - Fashion Digitalization

Chi vi parla...

CTO @ VisionestScientist @ Warda

Risolvo problemi

Page 3: Scala ed Rx in pratica

WARDA è la piattaforma software che mette ordine al MEDIA CHAOS mediante specifiche applicazioni che

coprono le esigenze in tutte le fasi dell’azienda

Style & Product Style & Product

Boarddigital technology

Boarddigital technologyVisual & Retail Visual & Retail

E-Commerce E-Commerce

Marketing & Social Marketing & Social

Page 4: Scala ed Rx in pratica

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

Page 5: Scala ed Rx in pratica

WARDA - Fashion Digitalization

Problema

Archivio storico80k file1.2TB

DAMHTTP

VelocementeSenza intervento manuale

Tracciando quanto eseguito

Page 6: Scala ed Rx in pratica

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

Page 7: Scala ed Rx in pratica

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 completamentoFuture#isCompleted è vero quando il valore è disponibile

Page 8: Scala ed Rx in pratica

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]]

Page 9: Scala ed Rx in pratica

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.

Page 10: Scala ed Rx in pratica

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

Page 11: Scala ed Rx in pratica

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())

Page 12: Scala ed Rx in pratica

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) } }

Page 13: Scala ed Rx in pratica

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

Page 14: Scala ed Rx in pratica

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?

Page 15: Scala ed Rx in pratica

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

Page 16: Scala ed Rx in pratica

WARDA - Fashion Digitalization

ReactiveX

Page 17: Scala ed Rx in pratica

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

Page 18: Scala ed Rx in pratica

WARDA - Fashion Digitalization

“Una traccia di quanto eseguito„

walker.subscribe(_ match { case TreeActionEnd( TreeResult(source, SyncDone(...), _), _) => localLog.println(f"...") case _ => Nil })

var files = 0LdoneResults.map(s => 1) .sum.subscribe(files = _)

var bytes = 0LdoneResults.map(_.bytes) .sum.subscribe(bytes = _)

Page 19: Scala ed Rx in pratica

WARDA - Fashion Digitalization

“Una traccia di quanto eseguito„

walker.connect

Page 20: Scala ed Rx in pratica

WARDA - Fashion Digitalization

Risultati

Problema risolto

Ottima interazione con Java

Codice riutilizzabile

Multithreading semplice

Page 21: Scala ed Rx in pratica

WARDA - Fashion Digitalization

Punti critici

Tempi di compilazione

Ecosistema giovane

Inversione della prospettiva

Page 22: Scala ed Rx in pratica

WARDA - Fashion Digitalization

Ringraziamenti

Page 23: Scala ed Rx in pratica

WARDA - Fashion Digitalization

Bonus 1: scopt

https://github.com/scopt/scopt

Page 24: Scala ed Rx in pratica

WARDA - Fashion Digitalization

Bonus 2: sbt

https://scala-sbt.org

Page 25: Scala ed Rx in pratica

WARDA - Fashion Digitalization

Bonus 3: example codehttps://goo.gl/QWHNNb

https://bitbucket.org/michelemauro/scalatvmeetup20150625

Page 26: Scala ed Rx in pratica

WARDA - Fashion Digitalization

Bonus 3: example codehttps://goo.gl/QWHNNb

https://bitbucket.org/michelemauro/scalatvmeetup20150625