How to Troubleshoot Apps for the Modern Connected Worker
Asynchronous programming 20180607
1. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
YIFAN XING - 2018
ASYNCHRONOUS
PROGRAMMING
Yifan Xing
SCALA.CONCURRENT AND
MONIX!
@yifan_xing_e
2. 01 Synchronous vs. Asynchronous
Differences
Futures & Promises
Debugging Async Programs
Monix
A TOUR OF ASYNCHRONOUS
PROGRAMMING IN SCALA
02
03
04
05Overview
ASYNCHRONOUS
PROGRAMMING:
SCALA.CONCURRENT
AND MONIX!
3. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Concurrency
Synchronous
Asynchronous
Single-threaded
Multi-threaded
YIFAN XING - 2018 @yifan_xing_e
4. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Synchronous: Single-threaded
YIFAN XING - 2018
Task 1 Task 2 Task 3
@yifan_xing_e
5. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Synchronous: Multi-threaded
YIFAN XING - 2018
Task 1
Task 2
Task 3
@yifan_xing_e
6. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Asynchronous: Single-threaded
YIFAN XING - 2018
Task 1
Task 2
Task 3
@yifan_xing_e
7. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Asynchronous: Multi-threaded
YIFAN XING - 2018
Task 1
Task 2
Task 3
@yifan_xing_e
9. YIFAN XING - 2018
Scala.concurrent: Future
Computation Incomplete:
Computation Completed:
Future is not completed
Future is completed: with a Value => Success
Future is completed: with an Exception => Failure
An object holding a value which may become available at some point
Immutable
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALAA TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
@yifan_xing_e
Future
11. YIFAN XING - 2018
Example: Callbacks
Chain callbacks
Allow one to enforce
callbacks to be
executed in a
specified order.
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
@yifan_xing_e
12. YIFAN XING - 2018
Example: Callbacks
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
@yifan_xing_e
Exception in
callback:
NOT propagated
to the
subsequent
andThen
callbacks.
15. YIFAN XING - 2018
Example: Transformations
If no match
cases or original future
contains a valid result:
New future will contain
the same result as the
original one.
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALAA TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
@yifan_xing_e
Evaluated only after
a Failure
16. YIFAN XING - 2018
Example: Transformations
If both futures failed,
the resulting future
holds the throwable
object of the first
future.
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
@yifan_xing_e
17. YIFAN XING - 2018
Scala.concurrent: Promises
A writable, single-assignment container
Can create a Future
Can complete a Future, only ONCE
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
@yifan_xing_e
Promise:
18. YIFAN XING - 2018
Example: Promises
A Promise can be
completed at most ONCE.
If the promise has already
been fulfilled, failed or
has timed out, calling this
method will throw an
IllegalStateException.
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
@yifan_xing_e
19. YIFAN XING - 2018
Example: Promises
If the promise has
already been
completed returns
false, or true
otherwise.
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
@yifan_xing_e
20. YIFAN XING - 2018
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Problem in A Client-facing Interface
@yifan_xing_e
21. YIFAN XING - 2018
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
p.future
Problem in A Client-facing Interface
@yifan_xing_e
23. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
What is Monix?
Asynchronous, event-based programs
Data type: Task, etc.
"Factory" of Future instances
Lazy & asynchronous computations
YIFAN XING - 2018 @yifan_xing_e
24. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Monix: Task
YIFAN XING - 2018
Lazily evaluated
Evaluated when
call runAsync
Trigger side effects
@yifan_xing_e
25. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Monix: Task Callback
YIFAN XING - 2018
Eagerly evaluate task
Register callbacks
Similar to
Future#onComplete
@yifan_xing_e
26. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Monix: Eager/ Lazy
YIFAN XING - 2018
Evaluate eagerly
Equivalent to Future#successful
Defer eager evaluation
Similar to Task#eval
@yifan_xing_e
27. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Monix: Memoization
YIFAN XING - 2018
Evaluated lazily
Not memoized, recompute each
time the Task is executed.
Evaluate lazily
Evaluated exactly ONCE
Result is memoized
@yifan_xing_e
28. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Monix: MemoizeOnSuccess
YIFAN XING - 2018
Exceptions are not cached.
Only cache the first
successful result
@yifan_xing_e
29. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Monix: Alternative Thread Pool
YIFAN XING - 2018
Overrides default scheduler
Overriding the "default"
scheduler can only happen
ONCE
Task is immutable
@yifan_xing_e
30. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Monix: CancelableFuture
YIFAN XING - 2018
Calling it multiple
times has the same side-
effect as calling it only once.
@yifan_xing_e
31. - A value
- Executed when constructed
- Eager evaluation
- ExecutionContext needed whenever use
operators
A function -
Execution controllable by user -
Lazy evaluation -
ExecutionScheduler needed whenever -
use runAsync
MonixFuture
Eager/Lazy
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
32. - Memoized by default
- Evaluated once
- Store result
Explicitly use memoization operators -
Evaluated whenever needed -
Referential transparency -
MonixFuture
Memoization
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
33. - Sometimes errors are
not propagated
Scheduler.reportFailure -
Defaults to System.err -
Allow customized logging tools -
MonixFuture
ErrorHandling
A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
38. Writing Async Code
1. Rethink before
adding more code
2. Adding more code to
fix problems will
usually add more bugs
D e b u g
1. Test code in isolation
2. Observe what is
happening
3. Confirm behavior
before moving on
T e s t
39. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Using Await & Print
YIFAN XING - 2018 @yifan_xing_e
TimeoutException if after
waiting for the specified
time awaitable is still not
ready
atMost may be:
A finite positive duration
Negative (no waiting is
done)
Duration.Inf for
unbounded waiting
40. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
ScalaTest: ScalaFutures
YIFAN XING - 2018 @yifan_xing_e
Default timeout
150ms
TestFailedException
if not finished after
timeout
41. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Resources: Async Debugger & Capture
YIFAN XING - 2018 @yifan_xing_e
IntelliJ Capture (2017):
Iulian Dragos - Async Debugger in Scala IDE
IntelliJ IDEA 2017.1 EAP Extends Debugger with Async Stacktraces
Developer's Explanation
Debugging Tutorial
Async Stacktraces
Stack Retention
Scala IDE Doc
Demo: Jamie Allen
Rethink the Debugger: Scala Days 2014
42. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
Using Async Debugger / Capture
YIFAN XING - 2018 @yifan_xing_e
Substituting its parts related
to the asynchronous code
execution with where it was
called
Sender: Async code executor
Receiver: executed code
Config exact signatures of
methods of the async code
Stores the stack and
variables info in a map
(1000 stacks), where the
key is a parameter with
the specified number.
43. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
YIFAN XING - 2018 @yifan_xing_e
( Sorry Alex :P )
44. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA
YIFAN XING - 2018 @yifan_xing_e