Transcript
Page 1: C++ Actor Model - You’ve Got Mail

www.italiancpp.org

C++ Actor ModelYou’ve Got Mail ...

Page 2: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Why are we here?

Page 3: C++ Actor Model - You’ve Got Mail

Italian C++ Community

std::thread/async, isn’t it enough?

Page 4: C++ Actor Model - You’ve Got Mail

Italian C++ Community

std::thread/async, isn’t it enough?

Example code: double_poll

Poll Left Poll Right

Thread 1 Thread 2

Acc

Increment

Add Add

Page 5: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Concurrency model

- Single Thread → Node.js

- Actor Model → Erlang

- CSP → GO

- STM → Clojure

- etc ...

Page 6: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Node.js

It’s simple

One thread

Asynchronous I/O (event-loop)

Page 7: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Node.js - Examples

var fs = require("fs");

fs.readFile('/etc/passwd', function (err, data) { if (err) throw err; console.log("-> " + data + " <-");});

----

var http = require('http');

http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n');}).listen(1337, "127.0.0.1");

console.log('Server running at http://127.0.0.1:1337/');

Page 8: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Node.js - Is it fast?

ab -n 10000 -c 1000 http://127.0.0.1:1337/

Time taken for tests: 1.283 secondsComplete requests: 10000Total transferred: 1130000 bytesRequests per second: 7797.21 [#/sec] (mean)Time per request: 128.251 [ms] (mean)Time per request: 0.128 [ms] (mean, across all concurrent requests)Transfer rate: 860.43 [Kbytes/sec] received

Connection Times (ms) min mean[+/-sd] median maxConnect: 0 58 232.7 0 1000Processing: 5 20 27.1 13 420Waiting: 5 20 27.1 13 420Total: 13 78 246.5 13 1234

Page 9: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Node.js - Is it fast?

YES!!!

Page 10: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Concurrency model

Single Thread → Node.js (Good)

Can we do better?

Copy from others ...

Page 11: C++ Actor Model - You’ve Got Mail

Italian C++ Community

ErlangErlang is a programming language used to build massively scalable soft real-time systems with requirements on high availability.

Page 12: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Actor Model

Page 13: C++ Actor Model - You’ve Got Mail

Italian C++ Community

A model of concurrent computation that treats "actors" as the primitives and fundamental units of computation.

Actor Model

Page 14: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Actor Model

It should embody three properties:

● Processing → Can do something● Storage → Can remember something● Communication → Can communicate with

others

Page 15: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Actor Model

In an actors system:

● Everything is an actor ● An actor is an entity that sends, receives

messages● An actor is an entity with a behaviour

Page 16: C++ Actor Model - You’ve Got Mail

Italian C++ Community

In response to a message that it receives, an actor can:

● create more actors● send messages to other actors ● determine how to respond to the next

message received

Actor Model

Page 17: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Actor Model

A1

A3

M1

A21

A22

A23

M2

M3

A2

Page 18: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Actor Model

Does it work?

Is it fast?

Page 19: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Erlang - Resultsab -n 10000 -c 1000 http://127.0.0.1:8080/

Time taken for tests: 0.538 secondsComplete requests: 10000Total transferred: 1300000 bytesRequests per second: 18604.20 [#/sec] (mean)Time per request: 53.751 [ms] (mean)Time per request: 0.054 [ms] (mean, across all concurrent requests)Transfer rate: 2361.86 [Kbytes/sec] received

Connection Times (ms) min mean[+/-sd] median maxConnect: 0 10 4.8 10 27Processing: 7 16 4.8 16 39Waiting: 5 13 4.2 13 34Total: 8 26 8.3 26 59

Page 20: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Erlang vs Node.js - ResultsNode.js

Time taken for tests: 1.461 secondsTotal transferred: 1140000 bytesRequests per second: 6843.55 [#/sec]Time per request: 146.123 [ms]Time per request: 0.146 [ms]Transfer rate: 761.88 [Kbytes/sec]

Connection Times (ms) min mean[+/-sd] median maxConnect: 0 59 234.5 0 1001Processing: 8 22 40.7 14 443Waiting: 7 22 40.7 14 443Total: 10 81 262.9 14 1443

Erlang

Time taken for tests: 0.538 secondsTotal transferred: 1300000 bytesRequests per second: 18604.20 [#/sec]Time per request: 53.751 [ms] Time per request: 0.054 [ms] Transfer rate: 2361.86 [Kbytes/sec]

Connection Times (ms) min mean[+/-sd] median maxConnect: 0 10 4.8 10 27Processing: 7 16 4.8 16 39Waiting: 5 13 4.2 13 34Total: 8 26 8.3 26 59

Page 21: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Actor Model - Is it Fast?

YES!!!

Page 22: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Erlang - Example

https://github.com/extend/cowboy

Page 23: C++ Actor Model - You’ve Got Mail

Italian C++ Community

C++ - Actor model

Page 24: C++ Actor Model - You’ve Got Mail

Italian C++ Community

C++ library

● http://neverlord.github.io/libcppa/ - Erlang inspired● http://www.theron-library.com/ - No fault - No Event IO● https://code.google.com/p/actor-cpp/source/list - Not developed since

2012● https://code.google.com/p/libactor/ - Right now it is usable, although it

may not be ready for production● https://casablanca.codeplex.com/ - Removed actor?!?!● http://www.stdthread.co.uk/ - No OSS

Page 25: C++ Actor Model - You’ve Got Mail

Italian C++ Community

libcppa - Features

● Lightweight actor implementations● Pattern matching for messages ● Error handling based on Erlang’s failure

model● etc ..

Page 26: C++ Actor Model - You’ve Got Mail

Italian C++ Community

libcppa - Is it enough?

Can it solve the initial problem?

example code: double_poll_actor

Page 27: C++ Actor Model - You’ve Got Mail

Italian C++ Community

libcppa - Is it enough?

Main

Poll Left

Poll Right

Acc

poll

poll

at

incLeft

incRight

inc

beast

beast

threshold

fire

fire

Page 28: C++ Actor Model - You’ve Got Mail

Italian C++ Community

libcppa - Actor == thread?

How many actors can I spawn?

A lot!!!!

example code: how_many_actors

Page 29: C++ Actor Model - You’ve Got Mail

Italian C++ Community

libcppa - Errors

● Isolated ● Linked● Monitored

example code: err_mng

Page 30: C++ Actor Model - You’ve Got Mail

Italian C++ Community

libcppa - I/O - brokers

A broker is an event-based actor running in the middleman that multiplexes socket I/O

Page 31: C++ Actor Model - You’ve Got Mail

Italian C++ Community

libcppa - I/O - brokers

● Create in particular way● Receive special messages from “system”● Can take ownership of given connection

example code: http_actor

Page 32: C++ Actor Model - You’ve Got Mail

Italian C++ Community

libcppa - Is it fast???

ab -n 10000 -c 1000 http://127.0.0.1:1339/

Time taken for tests: 0.438 secondsComplete requests: 10000Total transferred: 1480000 bytesRequests per second: 22848.00 [#/sec] (mean)Time per request: 43.767 [ms] (mean)Time per request: 0.044 [ms] (mean, across all concurrent requests)Transfer rate: 3302.25 [Kbytes/sec] received

Connection Times (ms) min mean[+/-sd] median maxConnect: 1 5 5.6 3 26Processing: 1 6 5.9 4 222Waiting: 1 4 4.8 3 221Total: 3 11 10.6 7 231

Page 33: C++ Actor Model - You’ve Got Mail

Italian C++ Community

libcppa vs Erlang - Resultslibcppa

Time taken for tests: 0.438 secondsTotal transferred: 1480000 bytesRequests per second: 22848.00 [#/sec] Time per request: 43.767 [ms]Time per request: 0.044 [ms]Transfer rate: 3302.25 [Kbytes/sec]

Connection Times (ms) min mean[+/-sd] median maxConnect: 1 5 5.6 3 26Processing: 1 6 5.9 4 222Waiting: 1 4 4.8 3 221Total: 3 11 10.6 7 231

Erlang

Time taken for tests: 0.538 secondsTotal transferred: 1300000 bytesRequests per second: 18604.20 [#/sec]Time per request: 53.751 [ms] Time per request: 0.054 [ms] Transfer rate: 2361.86 [Kbytes/sec]

Connection Times (ms) min mean[+/-sd] median maxConnect: 0 10 4.8 10 27Processing: 7 16 4.8 16 39Waiting: 5 13 4.2 13 34Total: 8 26 8.3 26 59

Page 34: C++ Actor Model - You’ve Got Mail

Italian C++ Community

libcppa - Is it fast???

YES!!!

Page 35: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Actor Model

Gianluca PadovaniSW craftsmanship, TDD addicted, agile coach. I like Ruby, NodeJs and everything is interesting. I also work a lot on C#, C++. I like to code, a lot :-)https://www.linkedin.com/pub/gianluca-padovani/2/261/a92

https://twitter.com/GPad619

https://github.com/gpad

http://www.slideshare.net/gpadovani

Page 36: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Reference● Carl Hewitt's Homepage● Hewitt, Meijer and Szyperski: The Actor Model● Takeaways from Hewitt, Meijer and Szyperski’s talk on the Actor model● https://github.com/Neverlord/libcppa● http://libcppa.blogspot.de/● Dominik Charousset and Matthias Vallentin: libcppa -- Designing an Actor

Semantic for C++11● https://github.com/mavam/vast● Learn you some Erlang● https://github.com/extend/cowboy● Actors are not a good concurrency model● Seven Languages in Seven Weeks: A Pragmatic Guide to Learning

Programming Languages

Page 37: C++ Actor Model - You’ve Got Mail

Italian C++ Community

Actor Model

Thank You!


Top Related