Coroutines for Microservices
_
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Blocking Code
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Callback Code
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Magic = Coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutines on JVM
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Project Loom
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutines Support
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Kotlin 1.3
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Kotlin Platforms
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Kotlin / Native ❤ LLVM
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutines in Kotlin
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Rules
JetBrains, @jonnyzzz, Oracle CodeOne 2018
suspend fun
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Generators
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Fibonacci Sequence
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Yield fun?
JetBrains, @jonnyzzz, Oracle CodeOne 2018
sequence = starts coroutine
JetBrains, @jonnyzzz, Oracle CodeOne 2018
suspend
JetBrains, @jonnyzzz, Oracle CodeOne 2018
How does it work?
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Prints
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutines ❤ Libraries
JetBrains, @jonnyzzz, Oracle CodeOne 2018
kotlinx.coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Remember?
JetBrains, @jonnyzzz, Oracle CodeOne 2018
open fun
JetBrains, @jonnyzzz, Oracle CodeOne 2018
open fun: 1 - start
JetBrains, @jonnyzzz, Oracle CodeOne 2018
open fun: 2 - suspend
JetBrains, @jonnyzzz, Oracle CodeOne 2018
open fun: 3 - subscribe
JetBrains, @jonnyzzz, Oracle CodeOne 2018
open fun: 4 - resume
JetBrains, @jonnyzzz, Oracle CodeOne 2018
open fun: 4’ - fail
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Open fun: 5 - resume
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Microservices?
12.5
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Microservices
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Performance?
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Perf Math
At 100 instances
20% better => 20 machines less!
$0.096/hour * 20 = $16,819/year
JetBrains, @jonnyzzz, Oracle CodeOne 2018
How we do Microservices?
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Approaches
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Example Service
The Service
Service A
Service C
Service B
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Blocking
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Blocking Service
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Thread per Request
JetBrains, @jonnyzzz, Oracle CodeOne 2018
How many threads �is possible?
18
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Starting Threads
JetBrains, @jonnyzzz, Oracle CodeOne 2018
macOS / Linux
JetBrains, @jonnyzzz, Oracle CodeOne 2018
macOS / Linux
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Windows
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Windows 10, JVM 1.8x64
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Too many Threads
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Too many Threads?
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Starting Coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Threads vs Coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Non-Blocking
25
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Callbacks
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Callbacks or CPS
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Callbacks / NIO
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Example Service
The Service
Service A
Service C
Service B
JetBrains, @jonnyzzz, Oracle CodeOne 2018
We had Blocking code
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Callbacks: a dream
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Callbacks: a reality
=> 2-3 methods or params per fun
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Callbacks: a reality
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Callbacks: a reality
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Callbacks: a reality
JetBrains, @jonnyzzz, Oracle CodeOne 2018
: (
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Non-Blocking�with Libraries
28
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Libraries for Callbacks
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Promises
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Observer in Rx
Implements those methods:
Use all possible Rx operators
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Rx Observable
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Rx Operators
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Reactive Programming
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Non-Blocking�with Coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Kotlin Coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
How does �suspend functions�work?
JetBrains, @jonnyzzz, Oracle CodeOne 2018
suspend function
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Compiled to Callback fun
JetBrains, @jonnyzzz, Oracle CodeOne 2018
The Callback
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutines are callbacks
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutines are callbacks
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutine State Machine
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Contemporary Syntax
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Non-Blocking �with �Language Support
32
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Language Support
Same concept, many impls
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Kotlin Coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
async / await
JetBrains, @jonnyzzz, Oracle CodeOne 2018
async/await
JetBrains, @jonnyzzz, Oracle CodeOne 2018
suspend execution
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Using OkHttp & await()
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Suspend & OkHttp
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutines & GRPC
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Use suspend functions
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Shared Mutable�State
35
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Shared + Mutable = Danger
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Channel<T>
SendChannel<T>
ReceiveChannel<T>
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Isolate State
Actor
Supplier A
Supplier C
Supplier B
STATE
CHANNEL
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Actor
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Using Actor
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Workers
Worker A
Worker C
Worker B
CHANNEL
CHANNEL
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Channels
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Select expression
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Kotlin Coroutines
40
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
kotlinx.coroutines �library�on GitHub
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Not only for JVM
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Try Kotlin Coroutines �for your code
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Try Kotlin Coroutines �for microservices
JetBrains, @jonnyzzz, Oracle CodeOne 2018
https://unsplash.com/photos/ukzHlkoz1IE
JetBrains, @jonnyzzz, Oracle CodeOne 2018
One more thing
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Learn and Try
Kotlin Coroutines in Practice �by Roman Elizarov
https://www.youtube.com/watch?v=a3agLJQ6vt8
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Thank you
Q&A
@jonnyzzz
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Microservices
what we care about™
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Kotlin Platforms
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Structured Concurrency
coroutineScope { … }
JetBrains, @jonnyzzz, Oracle CodeOne 2018
async / await
JetBrains, @jonnyzzz, Oracle CodeOne 2018
async / await
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
State Machine
JetBrains, @jonnyzzz, Oracle CodeOne 2018
kotlinx.coroutines Library
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Structured Concurrency
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Workers
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Channels
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Select
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Suspend
JetBrains, @jonnyzzz, Oracle CodeOne 2018
{ }
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
suspend functions
JetBrains, @jonnyzzz, Oracle CodeOne 2018
Using Coroutines
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018
http://thecodebarbarian.com/2015/03/20/callback-hell-is-a-myth
JetBrains, @jonnyzzz, Oracle CodeOne 2018
http://geekycentral.com/writing-a-recursive-function-using-promises-nodejs/
JetBrains, @jonnyzzz, Oracle CodeOne 2018
JetBrains, @jonnyzzz, Oracle CodeOne 2018