REST no more, use an actor Johan Janssen, Info Support @johanjanssen42 [email protected] Martin Kanters, Info Support [email protected]
REST no more, use an actor
Johan Janssen, Info Support@johanjanssen42
Martin Kanters, Info Support
Disclaimer: No Lego was harmed beyondrepair during the project.
CONTENT
Why?
Architecture
Actors
Remote actors
Shared protocol
HTTP vs Actors
Conclusion
Questions
WHY?
Why?
MINIMAL INGREDIENTS FOR 1 TRAIN ABOUT € 50
Raspberry Pi A+
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
ARCHITECTURE
Architecture
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)
LTCC (Laptop / Pi)
Lego Train
SwitchControl (Pi) Camera (Pi)
DeviceControl
(Pi)
Original controls
Infrared
Sound
Camera
Switches
LTCC APPLICATION
ACTORS
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"
REMOTE ACTORS
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
}}
}
SHARED PROTOCOL
Actor on JVM 1
Actor on JVM 2
Messages
Actor on laptop
MusicserviceActor on
Raspberry PiPlay message
CONCRETE EXAMPLE
Serverapplication
MessageProtocol
Raspberry Pi application
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)
HTTP VS REMOTE ACTOR
ADVANTAGES REMOTE ACTORS
No converting to JSON/SOAP
More natural programming
Concurrent on default
Built-in load balancer
Built-in circuit breaker
ADVANTAGES HTTP
Indepedent of technology
Loosely coupled
FAT JAR (SBT ASSEMBLY) IN MB
0
5
10
15
20
25
Local actor Remote actor Akka HTTP Spring boot
GATLING
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
REST is dead, long live remote actors!
- Johan Janssen
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
CONCLUSION
QUESTIONS?
Thank you!!
Johan Janssen, Info Support@johanjanssen42
Martin Kanters, Info Support