View
65
Download
4
Category
Preview:
Citation preview
USING ACTORS FOR THE INTERNET OF (LEGO) TRAINS
Johan Janssen, Info Support @johanjanssen42
Disclaimer: No Lego was harmed beyondrepair during the project.
CONTENT
Why? Getting started Architecture Actors Remote actors
Shared protocol HTTP vs Actors Conclusion Challenges Questions
WHY?
Why?
GETTING STARTED
MINIMAL INGREDIENTS FOR 1 TRAIN ABOUT € 50Raspberry Pi A+ / Raspberry Pi ZeroWifi 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
COMPARISONIdle (mA) Memory
(MB)CPU (Mhz) Size (mm)
RPi A+ 100 256 700 65 *56 RPi Zero 100 512 1000 65 * 30RPi B+ 200 512 700 85 *56RPi 2 B 230 1024 4*900 85 *56Odroid C1
325 1024 4*1500 85 *56
Particle Photon
80-100 128KB 120 38 * 21
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 ACTORSclass 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://ExampleActorSystem@127.0.0.1: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
Musicservice Actor
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/SOAPMore natural programming
Concurrent on defaultBuilt-in load balancerBuilt-in circuit breaker
ADVANTAGES HTTP
Indepedent of technology Loosely coupled
FAT JAR (SBT ASSEMBLY) IN MB
Local actor Remote actor Akka HTTP Spring boot0
5
10
15
20
25
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
pongJVM 2
Akka remote actor
Akka over TCP: pong
pong
50 50 no pause 500 500 no pause 1000 1000 no pause0
20
40
60
80
100
120
Mean response time (ms)
Akka HTTP Remote actor
50 50 no pause 500 500 no pause 1000 1000 no pause0
100
200
300
400
500
600
700
800
900
Max response time (ms)
Akka HTTP Remote actor
50 50 no pause 500 500 no pause 1000 1000 no pause0
50
100
150
200
250
300
350
99 percentile (ms)
Akka HTTP Remote actor
GRADUATION STUDENT
REST could handle around 600 usersRemote actors probably around 3300 users
REST is dead, long live remote actors!
- Johan Janssen
50 50 no pause 500 500 no pause 1000 1000 no pause0
5
10
15
20
25
30
Mean response time (ms)
Remote actor Spring boot
50 50 no pause 500 500 no pause 1000 1000 no pause0
100
200
300
400
500
600
700
800
900
Max response time (ms)
Remote actor Spring boot
50 50 no pause 500 500 no pause 1000 1000 no pause0
20
40
60
80
100
120
140
160
99 percentile (ms)
Remote actor Spring boot
Challenges
DO IT YOURSELF https://github.com/johanjanssen/
LCC LCCInstallScript
CONCLUSION
The best part!!
QUESTIONS?Johan Janssen, Info Support @johanjanssen42
Recommended