javaone: using actors for the iinternet of (lego) trains [con1709]

68
USING ACTORS FOR THE INTERNET OF (LEGO) TRAINS [CON1709] Johan Janssen, Info Support @johanjanssen42

Upload: johan-janssen

Post on 22-Jan-2018

178 views

Category:

Technology


0 download

TRANSCRIPT

USING ACTORS FOR THE INTERNET OF (LEGO) TRAINS [CON1709]

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 € 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

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

GRADUATION STUDENT

REST could handle around 600 users

Remote actors probably around 3300 users

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

Challenges

CONCLUSION

The best part!!

QUESTIONS?

Johan Janssen, Info Support @johanjanssen42