SlideShare a Scribd company logo
1 of 53
Download to read offline
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Akka voló sobre el nido del Future
Javier Santos
David Vallejo
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
About us
David Vallejo @dvnavarro
« It’s not a bug – it’s an
undocumented feature.»
Anonymous
Javier Santos @jpaniego
«Hay dos formas de programar sin
errores; solo la tercera funciona»
Alan J Perlis
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Introduction: A functional world
● Purely functional: whole world could be implemented
in a single functional line
● Functional features
○ Robust
○ Debuggable
○ Predictable
○ Pluggable
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Introduction: A functional world
● Example
type Context = (Input,Output,Error)
type Action = Context => (Context,Event)
def main(
actions: Iterable[Action],
context: Context):(Context,Seq[Event]) = {
((context,Seq.empty[Event]) /: actions) {
case ((context,events),action) =>
action.apply(context) match {
case (context,event) => (context, events :+ event)
}
}
}
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Introduction: A functional world
● Problem? World actions are not precalculated.
What happens to I/O?
● World can be considered as
○ asynchronous: Things may happen at same time
○ reactive: Things may happen due to
■ actions: that trigger …
■ ...events: action consequences.
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Introduction: Runnable & Callable
● java.lang.Runnable
trait Runnable {
def run(): Unit
}
● java.util.concurrent.Callable
trait Callable[V] {
def call(): V
}
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Introduction: Threads
● Scala’s concurrency model is built on Java’s
● java.lang.Thread
val myThread = new Thread(new Runnable {
def run(){
println(“hi”)
}
}
myThread.start()
● Thread improvements (ExecutorService ~ Thread pool)
● Anyway, Threads abstraction level is too low
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
What about Scala and threads?
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Overview
● By default, non-blocking operations
● They will hold a T value at some point
● So a future may be uncompleted(it has no value yet) or
completed
● Completion will be treated as a scala.util.Try value
It will have two possible values:
○ Success(t: T)
○ Failure(t: Throwable)
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Overview
● Future example
import scala.concurrent._
import ExecutionContext.Implicits.global
val firstPrimeNumbers: Future[List[Int]] = Future {
List(1,2,3,5,7,11,13)
//what if 'calculateFirstPrimeNumbers(100000000)'…
}
res0: Future[List[Int]]
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Overview
● Failing Future example
import scala.concurrent._
import ExecutionContext.Implicits.global
val thisWillFail: Future[Int] = Future(2 / 0)
res0: Future[Int]
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: ExecutionContext
● A future, once it’s completed, it never changes of value
● An ExecutionContext
○ executes tasks submitted to them.
○ They can be seen as thread pools.
○ Most of future ops require an implicit
ExecutionContext.
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Expecting results
● Expecting results.
○ Blocker way (discouraged but sometimes
mandatory).
○ Non-blocker way: using callbacks
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Blocking - Await
● Blocking: Await.result / Await.ready
import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
val f: Future[Int] = Future{
Thread.sleep(10000)
2
}
println(Await.result(f,12.seconds))
//2
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Blocking - Await
● Blocking: Await (Problem: Not enough time)
import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global
val f: Future[Int] = Future{
Thread.sleep(10000)
2
}
println(Await.result(f,5.seconds))
java.util.concurrent.TimeoutException: Futures timed out after
[5 seconds]
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Non-blocking - Callbacks
● Non-Blocking: callbacks
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
val f: Future[Int] = Future{
Thread.sleep(10000)
2
}
f.onComplete( n => println(n) )
//at some point, “Success(2)” will appear
Non-blocking
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Callbacks
● Callbacks will be executed asynchronously when future
is completed
● type Callback = Try[T] => Unit
● Try[T] ~ Either[Throwable,T]
○ Left(throwable) ~ Failure(throwable)
○ Right(t) ~ Success(t)
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Callbacks
● onComplete
f.onComplete( (t: Try[Int]) => println(t) )
//Success(2)
● onSuccess
f.onSuccess( n => println(n) )
//2
● onFailure
f.onFailure( throwable => println(throwable.getMessage) )
//it will never print an error (because it equals Success(2))
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Operations
● map
def getFirstMillionOfPrimes(): Future[List[Int]] = ???
getFirstMillionOfPrimes().map(
(list: List[Int]) => list.head)
res0: Future[Int]
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Operations
● flatMap
def getFirstMillionOfPrimes(): Future[List[Int]] = ???
def concatenate(l: List[Int]): Future[String] = ???
getFirstMillionOfPrimes().flatMap(
(list: List[Int]) => concatenate(list))
res0: Future[String]
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Monad behavior
● Composition
○ Future is like a monad
■ Point Function: Future.apply
■ Bind Function: flatMap
■ Some math properties and so...
○ Since Future has map,flatMap,filter methods;
it can be composed easily in a for-comprehension
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Composition
● Problem
var result: String = “”
val f1: Future[Unit] = Future{
result += “Hi ”
}
val f2: Future[Unit] = Future{
result += “ everyone”
}
● result value? “Hi everyone”? “ everyoneHi”?
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Composition
● for-comprehension is your friend
for {
primes <- getFirstMillionPrimes()
primesString <- concatenate(primes)
} yield primesString
res0: Future[String]
Future[List[Int]]
Future[String]
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Recovering from failure
● recover
val f: Future[Int] = Future{
1 / 0
}.recover{
case e: ArithmeticException => 0
}
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Recovering from failure
● recoverWith
val f: Future[Int] = Future{
1 / 0
}.recoverWith{
case e: ArithmeticException => Future(0)
}
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future: Recovering from failure
● fallbackTo
val f1: Future[Int] = Future{
1 / 0
}
val f2: Future[Int] = Future(0)
val f = f1 fallbackTo f2
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Promise: Overview
● Futures can be created by
○ Future.apply
○ Promises
● You can think about it like
○ Future ~ Read future value
○ Promise ~ Write future value
● Promises are single-assigned (just once. Immutable as
futures)
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Promise: Baggage & claim
Menu
order
Menu
Being
Cooked
Ticket
Menu ready
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Promise: Baggage & claim
Begin
completion
Future[T]
p.success
or
p.failure
Try[T]
Promise[T]
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Promise: example
val r: T = produceSomething()
p success r
doSomethingElse()
startDoingSomething()
f onSuccess {
case r: T => handleResult()
}
val p = promise[T]
val f = p.future
Producer Consumer
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Promise: completion
● complete
val p = promise[Int]
p.complete(Try(2))
● completeWith
val p = promise[Int]
p.completeWith(Future(2))
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Future alternatives
● Scalaz futures
● Scala’s async library
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Tones of slides and however...
Futures/Promises
Akka actors
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Akka: main concepts
● Actors, actors everywhere
● Asynchronous messages
● Event-driven processes
● Distributed systems
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Akka: Actors
● Black box
● State without race condition
● Messages to update the state
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Akka: Actors
class MyFirstActor extends Actor {
override def receive = {
case _ => println("Hello World!")
}
}
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Akka: Send a message
● Tell message
actor ! "Hi"
● Ask message
actor ? "Are you there"
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Akka: Ask pattern
implicit val timeout = Timeout(5 seconds)
val f: Future[String] =
(actorRef ? AreYouThere).mapTo[String]
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Akka: An example
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Akka: Services user
service
contact
service
address
service
System
GetUser(id)
GetContacts(name)
GetAddress(name)
Option[User]
List[Contact]
Address
UserInfo
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Akka: Ask Pattern & For
Comprehension
class UserServiceActor extends Actor {
val users: Map[String, User] =
Map("1" -> User("John"), "2" -> User("Jack"))
override def receive = {
case GetUser(userId: String) =>
sender ! users.get(userId)
}
}
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Akka: Ask Pattern & For
Comprehension
def getInfo(userId: String): Future[UserInfo] =
for {
Some(user) <- (usersActor ? GetUser(userId))
.mapTo[Option[User]]
contacts <- (contactsActor.?(GetContacts(user.name))
(Timeout(5 seconds),context.self))
.mapTo[List[Contact]]
address <- (addressesActor ? GetAddress(user.name))
.mapTo[Address]
} yield UserInfo(user, contacts, address)
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
scalera.es
@scalerablog
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Primeros pasos con Akka:
Olvídate de los threads
27 NOVEMBER
TRACK D
18:00
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Caminando de Java a Scala en
menos de 2 horas
28 NOVEMBER
TRACK B
9:30
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
MADRID · NOV 27-28 · 2015
Scala Programming @ Madrid
Akka voló sobre el nido del Future
Javier Santos
David Vallejo

More Related Content

What's hot

Practical Aggregate Programming in Scala
Practical Aggregate Programming in ScalaPractical Aggregate Programming in Scala
Practical Aggregate Programming in Scala
Roberto Casadei
 

What's hot (11)

Aggregate Programming in Scala
Aggregate Programming in ScalaAggregate Programming in Scala
Aggregate Programming in Scala
 
Spark: Taming Big Data
Spark: Taming Big DataSpark: Taming Big Data
Spark: Taming Big Data
 
Practical Aggregate Programming in Scala
Practical Aggregate Programming in ScalaPractical Aggregate Programming in Scala
Practical Aggregate Programming in Scala
 
Value objects in JS - an ES7 work in progress
Value objects in JS - an ES7 work in progressValue objects in JS - an ES7 work in progress
Value objects in JS - an ES7 work in progress
 
Parallel sorting Algorithms
Parallel  sorting AlgorithmsParallel  sorting Algorithms
Parallel sorting Algorithms
 
Data Mining: Implementation of Data Mining Techniques using RapidMiner software
Data Mining: Implementation of Data Mining Techniques using RapidMiner softwareData Mining: Implementation of Data Mining Techniques using RapidMiner software
Data Mining: Implementation of Data Mining Techniques using RapidMiner software
 
Bitonic Sort in Shared SIMD Array Processor
Bitonic Sort in Shared SIMD Array ProcessorBitonic Sort in Shared SIMD Array Processor
Bitonic Sort in Shared SIMD Array Processor
 
Clojure
ClojureClojure
Clojure
 
(chapter 7) A Concise and Practical Introduction to Programming Algorithms in...
(chapter 7) A Concise and Practical Introduction to Programming Algorithms in...(chapter 7) A Concise and Practical Introduction to Programming Algorithms in...
(chapter 7) A Concise and Practical Introduction to Programming Algorithms in...
 
Intro to JavaScript - Week 4: Object and Array
Intro to JavaScript - Week 4: Object and ArrayIntro to JavaScript - Week 4: Object and Array
Intro to JavaScript - Week 4: Object and Array
 
Digital Publishing for Scale: The Economist and Go
Digital Publishing for Scale: The Economist and GoDigital Publishing for Scale: The Economist and Go
Digital Publishing for Scale: The Economist and Go
 

Viewers also liked (7)

common things Team 11788
common things Team 11788common things Team 11788
common things Team 11788
 
Blue sky credentials may 6th 2012 eng biilboard focus ver 2003 print
Blue sky credentials may 6th 2012 eng biilboard focus ver 2003 printBlue sky credentials may 6th 2012 eng biilboard focus ver 2003 print
Blue sky credentials may 6th 2012 eng biilboard focus ver 2003 print
 
Vald aosta 2
Vald aosta 2Vald aosta 2
Vald aosta 2
 
Scientific Revolution
Scientific RevolutionScientific Revolution
Scientific Revolution
 
Lezione1
Lezione1Lezione1
Lezione1
 
GENeral Admission: A Consumer Behavior Approach in Marketing to the Millennia...
GENeral Admission: A Consumer Behavior Approach in Marketing to the Millennia...GENeral Admission: A Consumer Behavior Approach in Marketing to the Millennia...
GENeral Admission: A Consumer Behavior Approach in Marketing to the Millennia...
 
Digital credential
Digital credentialDigital credential
Digital credential
 

Similar to Codemotion akka voló sobre el nido del future

Introduction to Asynchronous scala
Introduction to Asynchronous scalaIntroduction to Asynchronous scala
Introduction to Asynchronous scala
Stratio
 
Developing a new Scala DSL for Apache Camel
Developing a new Scala DSL for Apache CamelDeveloping a new Scala DSL for Apache Camel
Developing a new Scala DSL for Apache Camel
elliando dias
 
Two Days workshop on MATLAB
Two Days workshop on MATLABTwo Days workshop on MATLAB
Two Days workshop on MATLAB
Bhavesh Shah
 

Similar to Codemotion akka voló sobre el nido del future (20)

RxJava in practice
RxJava in practice RxJava in practice
RxJava in practice
 
Scala for dummies
Scala for dummiesScala for dummies
Scala for dummies
 
Railroading into Scala
Railroading into ScalaRailroading into Scala
Railroading into Scala
 
Introduction to Asynchronous scala
Introduction to Asynchronous scalaIntroduction to Asynchronous scala
Introduction to Asynchronous scala
 
Scala.pdf
Scala.pdfScala.pdf
Scala.pdf
 
Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)
Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)
Standardizing JavaScript Decorators in TC39 (Full Stack Fest 2019)
 
Object oriented programming with java pdf
Object oriented programming with java pdfObject oriented programming with java pdf
Object oriented programming with java pdf
 
Camel Scala
Camel ScalaCamel Scala
Camel Scala
 
camel-scala.pdf
camel-scala.pdfcamel-scala.pdf
camel-scala.pdf
 
camel-scala.pdf
camel-scala.pdfcamel-scala.pdf
camel-scala.pdf
 
Developing a new Scala DSL for Apache Camel
Developing a new Scala DSL for Apache CamelDeveloping a new Scala DSL for Apache Camel
Developing a new Scala DSL for Apache Camel
 
camel-scala.pdf
camel-scala.pdfcamel-scala.pdf
camel-scala.pdf
 
camel-scala.pdf
camel-scala.pdfcamel-scala.pdf
camel-scala.pdf
 
Scala - core features
Scala - core featuresScala - core features
Scala - core features
 
Scilab: Computing Tool For Engineers
Scilab: Computing Tool For EngineersScilab: Computing Tool For Engineers
Scilab: Computing Tool For Engineers
 
Introduction to MATLAB
Introduction to MATLABIntroduction to MATLAB
Introduction to MATLAB
 
Two Days workshop on MATLAB
Two Days workshop on MATLABTwo Days workshop on MATLAB
Two Days workshop on MATLAB
 
Debugging and Profiling C++ Template Metaprograms
Debugging and Profiling C++ Template MetaprogramsDebugging and Profiling C++ Template Metaprograms
Debugging and Profiling C++ Template Metaprograms
 
Porting R Models into Scala Spark
Porting R Models into Scala SparkPorting R Models into Scala Spark
Porting R Models into Scala Spark
 
Programming in Scala: Notes
Programming in Scala: NotesProgramming in Scala: Notes
Programming in Scala: Notes
 

Recently uploaded

Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
amitlee9823
 
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ssuser89054b
 
notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.ppt
MsecMca
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
dollysharma2066
 
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 

Recently uploaded (20)

Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
 
Generative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPTGenerative AI or GenAI technology based PPT
Generative AI or GenAI technology based PPT
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
 
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
 
22-prompt engineering noted slide shown.pdf
22-prompt engineering noted slide shown.pdf22-prompt engineering noted slide shown.pdf
22-prompt engineering noted slide shown.pdf
 
A Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna MunicipalityA Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna Municipality
 
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Netaji Nagar, Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
 
Thermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - VThermal Engineering-R & A / C - unit - V
Thermal Engineering-R & A / C - unit - V
 
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance BookingCall Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
Call Girls Wakad Call Me 7737669865 Budget Friendly No Advance Booking
 
Design For Accessibility: Getting it right from the start
Design For Accessibility: Getting it right from the startDesign For Accessibility: Getting it right from the start
Design For Accessibility: Getting it right from the start
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
notes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.pptnotes on Evolution Of Analytic Scalability.ppt
notes on Evolution Of Analytic Scalability.ppt
 
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
VIP Model Call Girls Kothrud ( Pune ) Call ON 8005736733 Starting From 5K to ...
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 
2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects
 
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort ServiceCall Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
Call Girls in Ramesh Nagar Delhi 💯 Call Us 🔝9953056974 🔝 Escort Service
 
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdfONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
ONLINE FOOD ORDER SYSTEM PROJECT REPORT.pdf
 
Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024
 
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
 
Unit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfUnit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdf
 

Codemotion akka voló sobre el nido del future

  • 1. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Akka voló sobre el nido del Future Javier Santos David Vallejo
  • 2. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid About us David Vallejo @dvnavarro « It’s not a bug – it’s an undocumented feature.» Anonymous Javier Santos @jpaniego «Hay dos formas de programar sin errores; solo la tercera funciona» Alan J Perlis
  • 3. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Introduction: A functional world ● Purely functional: whole world could be implemented in a single functional line ● Functional features ○ Robust ○ Debuggable ○ Predictable ○ Pluggable
  • 4. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Introduction: A functional world ● Example type Context = (Input,Output,Error) type Action = Context => (Context,Event) def main( actions: Iterable[Action], context: Context):(Context,Seq[Event]) = { ((context,Seq.empty[Event]) /: actions) { case ((context,events),action) => action.apply(context) match { case (context,event) => (context, events :+ event) } } }
  • 5. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid
  • 6. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Introduction: A functional world ● Problem? World actions are not precalculated. What happens to I/O? ● World can be considered as ○ asynchronous: Things may happen at same time ○ reactive: Things may happen due to ■ actions: that trigger … ■ ...events: action consequences.
  • 7. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Introduction: Runnable & Callable ● java.lang.Runnable trait Runnable { def run(): Unit } ● java.util.concurrent.Callable trait Callable[V] { def call(): V }
  • 8. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Introduction: Threads ● Scala’s concurrency model is built on Java’s ● java.lang.Thread val myThread = new Thread(new Runnable { def run(){ println(“hi”) } } myThread.start() ● Thread improvements (ExecutorService ~ Thread pool) ● Anyway, Threads abstraction level is too low
  • 9. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid What about Scala and threads?
  • 10. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Overview ● By default, non-blocking operations ● They will hold a T value at some point ● So a future may be uncompleted(it has no value yet) or completed ● Completion will be treated as a scala.util.Try value It will have two possible values: ○ Success(t: T) ○ Failure(t: Throwable)
  • 11. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Overview ● Future example import scala.concurrent._ import ExecutionContext.Implicits.global val firstPrimeNumbers: Future[List[Int]] = Future { List(1,2,3,5,7,11,13) //what if 'calculateFirstPrimeNumbers(100000000)'… } res0: Future[List[Int]]
  • 12. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Overview ● Failing Future example import scala.concurrent._ import ExecutionContext.Implicits.global val thisWillFail: Future[Int] = Future(2 / 0) res0: Future[Int]
  • 13. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: ExecutionContext ● A future, once it’s completed, it never changes of value ● An ExecutionContext ○ executes tasks submitted to them. ○ They can be seen as thread pools. ○ Most of future ops require an implicit ExecutionContext.
  • 14. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Expecting results ● Expecting results. ○ Blocker way (discouraged but sometimes mandatory). ○ Non-blocker way: using callbacks
  • 15. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Blocking - Await ● Blocking: Await.result / Await.ready import scala.concurrent._ import scala.concurrent.duration._ import scala.concurrent.ExecutionContext.Implicits.global val f: Future[Int] = Future{ Thread.sleep(10000) 2 } println(Await.result(f,12.seconds)) //2
  • 16. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Blocking - Await ● Blocking: Await (Problem: Not enough time) import scala.concurrent._ import scala.concurrent.duration._ import scala.concurrent.ExecutionContext.Implicits.global val f: Future[Int] = Future{ Thread.sleep(10000) 2 } println(Await.result(f,5.seconds)) java.util.concurrent.TimeoutException: Futures timed out after [5 seconds]
  • 17. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Non-blocking - Callbacks ● Non-Blocking: callbacks import scala.concurrent._ import scala.concurrent.ExecutionContext.Implicits.global val f: Future[Int] = Future{ Thread.sleep(10000) 2 } f.onComplete( n => println(n) ) //at some point, “Success(2)” will appear Non-blocking
  • 18. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Callbacks ● Callbacks will be executed asynchronously when future is completed ● type Callback = Try[T] => Unit ● Try[T] ~ Either[Throwable,T] ○ Left(throwable) ~ Failure(throwable) ○ Right(t) ~ Success(t)
  • 19. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Callbacks ● onComplete f.onComplete( (t: Try[Int]) => println(t) ) //Success(2) ● onSuccess f.onSuccess( n => println(n) ) //2 ● onFailure f.onFailure( throwable => println(throwable.getMessage) ) //it will never print an error (because it equals Success(2))
  • 20. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Operations ● map def getFirstMillionOfPrimes(): Future[List[Int]] = ??? getFirstMillionOfPrimes().map( (list: List[Int]) => list.head) res0: Future[Int]
  • 21. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Operations ● flatMap def getFirstMillionOfPrimes(): Future[List[Int]] = ??? def concatenate(l: List[Int]): Future[String] = ??? getFirstMillionOfPrimes().flatMap( (list: List[Int]) => concatenate(list)) res0: Future[String]
  • 22. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Monad behavior ● Composition ○ Future is like a monad ■ Point Function: Future.apply ■ Bind Function: flatMap ■ Some math properties and so... ○ Since Future has map,flatMap,filter methods; it can be composed easily in a for-comprehension
  • 23. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid
  • 24. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Composition ● Problem var result: String = “” val f1: Future[Unit] = Future{ result += “Hi ” } val f2: Future[Unit] = Future{ result += “ everyone” } ● result value? “Hi everyone”? “ everyoneHi”?
  • 25. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid
  • 26. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Composition ● for-comprehension is your friend for { primes <- getFirstMillionPrimes() primesString <- concatenate(primes) } yield primesString res0: Future[String] Future[List[Int]] Future[String]
  • 27. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Recovering from failure ● recover val f: Future[Int] = Future{ 1 / 0 }.recover{ case e: ArithmeticException => 0 }
  • 28. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Recovering from failure ● recoverWith val f: Future[Int] = Future{ 1 / 0 }.recoverWith{ case e: ArithmeticException => Future(0) }
  • 29. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future: Recovering from failure ● fallbackTo val f1: Future[Int] = Future{ 1 / 0 } val f2: Future[Int] = Future(0) val f = f1 fallbackTo f2
  • 30. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Promise: Overview ● Futures can be created by ○ Future.apply ○ Promises ● You can think about it like ○ Future ~ Read future value ○ Promise ~ Write future value ● Promises are single-assigned (just once. Immutable as futures)
  • 31. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Promise: Baggage & claim Menu order Menu Being Cooked Ticket Menu ready
  • 32. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Promise: Baggage & claim Begin completion Future[T] p.success or p.failure Try[T] Promise[T]
  • 33. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Promise: example val r: T = produceSomething() p success r doSomethingElse() startDoingSomething() f onSuccess { case r: T => handleResult() } val p = promise[T] val f = p.future Producer Consumer
  • 34. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Promise: completion ● complete val p = promise[Int] p.complete(Try(2)) ● completeWith val p = promise[Int] p.completeWith(Future(2))
  • 35. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Future alternatives ● Scalaz futures ● Scala’s async library
  • 36. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Tones of slides and however... Futures/Promises Akka actors
  • 37. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid
  • 38. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Akka: main concepts ● Actors, actors everywhere ● Asynchronous messages ● Event-driven processes ● Distributed systems
  • 39. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Akka: Actors ● Black box ● State without race condition ● Messages to update the state
  • 40. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Akka: Actors class MyFirstActor extends Actor { override def receive = { case _ => println("Hello World!") } }
  • 41. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Akka: Send a message ● Tell message actor ! "Hi" ● Ask message actor ? "Are you there"
  • 42. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Akka: Ask pattern implicit val timeout = Timeout(5 seconds) val f: Future[String] = (actorRef ? AreYouThere).mapTo[String]
  • 43. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Akka: An example
  • 44. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Akka: Services user service contact service address service System GetUser(id) GetContacts(name) GetAddress(name) Option[User] List[Contact] Address UserInfo
  • 45. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Akka: Ask Pattern & For Comprehension class UserServiceActor extends Actor { val users: Map[String, User] = Map("1" -> User("John"), "2" -> User("Jack")) override def receive = { case GetUser(userId: String) => sender ! users.get(userId) } }
  • 46. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Akka: Ask Pattern & For Comprehension def getInfo(userId: String): Future[UserInfo] = for { Some(user) <- (usersActor ? GetUser(userId)) .mapTo[Option[User]] contacts <- (contactsActor.?(GetContacts(user.name)) (Timeout(5 seconds),context.self)) .mapTo[List[Contact]] address <- (addressesActor ? GetAddress(user.name)) .mapTo[Address] } yield UserInfo(user, contacts, address)
  • 47. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid
  • 48. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid scalera.es @scalerablog
  • 49. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid
  • 50. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Primeros pasos con Akka: Olvídate de los threads 27 NOVEMBER TRACK D 18:00
  • 51. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Caminando de Java a Scala en menos de 2 horas 28 NOVEMBER TRACK B 9:30
  • 52. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid
  • 53. MADRID · NOV 27-28 · 2015 Scala Programming @ Madrid Akka voló sobre el nido del Future Javier Santos David Vallejo