Scala ed Rx in pratica

Post on 18-Aug-2015

100 views 1 download

Transcript of Scala ed Rx in pratica

Scala ed Rx in pratica

Michele Mauro@michelemauro

Scala Treviso Meetup25/06/2015

WARDA - Fashion Digitalization

Chi vi parla...

CTO @ VisionestScientist @ Warda

Risolvo problemi

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

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

WARDA - Fashion Digitalization

Problema

Archivio storico80k file1.2TB

DAMHTTP

VelocementeSenza intervento manuale

Tracciando quanto eseguito

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

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

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

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.

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

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

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

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

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?

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

WARDA - Fashion Digitalization

ReactiveX

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

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 = _)

WARDA - Fashion Digitalization

“Una traccia di quanto eseguito„

walker.connect

WARDA - Fashion Digitalization

Risultati

Problema risolto

Ottima interazione con Java

Codice riutilizzabile

Multithreading semplice

WARDA - Fashion Digitalization

Punti critici

Tempi di compilazione

Ecosistema giovane

Inversione della prospettiva

WARDA - Fashion Digitalization

Ringraziamenti

WARDA - Fashion Digitalization

Bonus 1: scopt

https://github.com/scopt/scopt

WARDA - Fashion Digitalization

Bonus 2: sbt

https://scala-sbt.org

WARDA - Fashion Digitalization

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

https://bitbucket.org/michelemauro/scalatvmeetup20150625

WARDA - Fashion Digitalization

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

https://bitbucket.org/michelemauro/scalatvmeetup20150625