javaone: using actors for the iinternet of (lego) trains [con1709]
TRANSCRIPT
USING ACTORS FOR THE INTERNET OF (LEGO) TRAINS [CON1709]
Johan Janssen, Info Support @johanjanssen42
CONTENT
Why?
Getting started
Architecture
Actors
Remote actors
Shared protocol
HTTP vs Actors
Conclusion
Challenges
Questions
MINIMAL INGREDIENTS FOR 1 TRAIN ABOUT € 50
Raspberry Pi A+ / Raspberry Pi Zero
Wifi dongleEDUP Ultra-Mini Nano USB 2.0 802.11n
USB battery packAnker® 2. Gen Astro Mini 3200mAh
Infrared transmitterKeyes 38KHz IR Infrared Transmitter Module for
Arduino
COMPARISON
Idle (mA) Memory (MB) CPU (Mhz) Size (mm)
RPi A+ 100 256 700 65 *56
RPi Zero 100 512 1000 65 * 30
RPi B+ 200 512 700 85 *56
RPi 2 B 230 1024 4*900 85 *56
Odroid C1 325 1024 4*1500 85 *56
Particle Photon
80-100 128KB 120 38 * 21
LTCC
(Angular)
LTCC
(Java)
DeviceControl
(Java)
Infrared
(C and LIRC)
RFID
(C)
SwitchControl
(Java)
Servo
(Python)
RPi-Cam-Web-Interface
(C)
LTCC
(Angular)
LTCC
(Scala/Akka)
DeviceControl
(Scala/Akka)
Infrared
(C and LIRC)
RFID
(C)
SwitchControl
(Scala/Akka)
Servo
(Python)
Leds with Photon
(C)
RPi-Cam-Web-Interface
(C)
AKKA ACTORS
class Worker extends Actor {def receive = {case x =>println(x)
}}
val system = ActorSystem("ExampleActorSystem")
val workerActorRef = system.actorOf(Props[Worker])workerActorRef ! "Hello conference"
AKKA REMOTE ACTOR CALL
val workerActorRef = system.actorOf(Props[Worker])
val workerActorRef = system.actorSelection("akka.tcp://[email protected]:9005/user/workerActor")
AKKA REMOTE ACTOR CONFIGURATION
akka {actor {provider = "akka.remote.RemoteActorRefProvider"
}remote {enabled-transports = ["akka.remote.netty.tcp"]netty.tcp {hostname = "127.0.0.1"port = 9002
}}
}
EXAMPLE MESSAGE
object MusicServiceMessage {case class Play(filename: String)case class MusicList(filenames: List[Song])
}
MESSAGE USED BY APPLICATION
val actorRef = context.actorSelection("akka.tcp://[Actorsystem]@[IP]:[port]/user/musicservice")
actorRef ! [packagename].MusicServiceMessage.Play(filename)
ADVANTAGES REMOTE ACTORS
No converting to JSON/SOAP
More natural programming
Concurrent on default
Built-in load balancer
Built-in circuit breaker
class ExampleSimulation extends Simulation {
val scn = scenario("My scenario").repeat(100) {
exec(
http("Ping")
.get("http://localhost:8080/ping")
.check(status.is(200))
).pause(100 millisecond) // Optional
}
setUp(scn.inject(
rampUsers(1000) over (10 seconds) // Changing
))
}
PERFORMANCE TEST SETUP
JVM 1Akka HTTP
HTTP: /ping
pong JVM 2Akka HTTP
HTTP: /pong
pong
JVM 1Akka HTTP
HTTP: /ping
pong JVM 2Akka remote actor
Akka over TCP: pong
pong
0
20
40
60
80
100
120
50 50 no pause 500 500 no pause 1000 1000 no pause
Mean response time (ms)
Akka HTTP Remote actor
0
100
200
300
400
500
600
700
800
900
50 50 no pause 500 500 no pause 1000 1000 no pause
Max response time (ms)
Akka HTTP Remote actor
0
50
100
150
200
250
300
350
50 50 no pause 500 500 no pause 1000 1000 no pause
99 percentile (ms)
Akka HTTP Remote actor
0
5
10
15
20
25
30
50 50 no pause 500 500 no pause 1000 1000 no pause
Mean response time (ms)
Remote actor Spring boot
0
100
200
300
400
500
600
700
800
900
50 50 no pause 500 500 no pause 1000 1000 no pause
Max response time (ms)
Remote actor Spring boot
0
20
40
60
80
100
120
140
160
50 50 no pause 500 500 no pause 1000 1000 no pause
99 percentile (ms)
Remote actor Spring boot