libcppa now high level distributed programming without
play

libcppa Now: High-Level Distributed Programming Without Sacrificing - PowerPoint PPT Presentation

libcppa Now: High-Level Distributed Programming Without Sacrificing Performance Matthias Vallentin matthias@bro.org University of California, Berkeley C ++ Now May 14, 2013 Outline 1. Example Application: VAST 2. Designing Distributed


  1. libcppa Now: High-Level Distributed Programming Without Sacrificing Performance Matthias Vallentin matthias@bro.org University of California, Berkeley C ++ Now May 14, 2013

  2. Outline 1. Example Application: VAST 2. Designing Distributed Applications 3. Thinking libcppa Interfacing with 3rd-party APIs Agility Through Network Transparency Behavior Composition Monadic Composition 1 / 17

  3. The Network Security Domain Network Forensics & Incident Response ◮ Scenario: security breach discovered ◮ Analysts have to determine scope and impact Analyst questions ◮ How did the attacker(s) get in? ◮ How long did the they stay under the radar? ◮ What is the damage ($$$, reputation, data loss, etc.)? ◮ How to detect similar attacks in the future? Challenges ◮ Volume : machine-generated data exceeds analysis capacities ◮ Typing : difficult to contextualize minimally typed data ◮ Heterogeneity : numerous log formats and processing styles 2 / 17

  4. VAST: Visibility Across Space and Time Architecture Overview SSHD IDS Analyst VAST A scalable , interactive system to facilitate ◮ forensic analyses Ingestor Query ◮ incident response Components Segments Partitions ◮ Archive : Compressed, serialized events Memory ◮ Index : Encoded, compressed bitmaps ◮ Segment/Partition : Data scaling unit ◮ Ingestion : Sources: IDS, syslog, etc. Archive Index ◮ Query : Sinks: Analyst, IDS, feed, etc. Storage 3 / 17

  5. VAST: Distributed Deployment Analyst VAST core 4 / 17

  6. Outline 1. Example Application: VAST 2. Designing Distributed Applications 3. Thinking libcppa Interfacing with 3rd-party APIs Agility Through Network Transparency Behavior Composition Monadic Composition 4 / 17

  7. Software Design in Distributed Applications Component A Component B Component C 5 / 17

  8. Challenge: Varying Deployment Scenarios Machine 1 Component A Component B Machine 2 Component C 6 / 17

  9. Challenge: Varying Deployment Scenarios Pointer IPC & Passing Serialization Machine 1 Component A Component B Machine 2 Component C 7 / 17

  10. Primitives for Programming Distributed Systems Desired Building Blocks Machine 1 Component A Component B ◮ Flexible serialization ◮ Platform independence ◮ Network transparency Machine 2 Component C ◮ Rich-typed messaging ◮ Asynchronous coding style ◮ Powerful concurrency model C ++ Reality No existing light-weight middle-layer with high level of abstraction � libcppa aims to fill that gap 8 / 17

  11. Outline 1. Example Application: VAST 2. Designing Distributed Applications 3. Thinking libcppa Interfacing with 3rd-party APIs Agility Through Network Transparency Behavior Composition Monadic Composition 8 / 17

  12. Outline 1. Example Application: VAST 2. Designing Distributed Applications 3. Thinking libcppa Interfacing with 3rd-party APIs Agility Through Network Transparency Behavior Composition Monadic Composition 8 / 17

  13. Creating a TCP/IP Server VAST: Data Ingestion 1. Accept new TCP/IP connection Ingestor 2. Poll POSIX file descriptor of connection 3. Read from socket when data is available 4. Convert data into internal event format Segments Partitions Memory Existing solutions ◮ Basic: accept & fork (or new thread) Archive Index ◮ Boost Asio: non-blocking, but IoC Storage 9 / 17

  14. A Generic Asynchronous IPv4 Server template <typename Connection> void server(uint16_t port, char const* addr, actor_ptr handler) { auto acceptor = network::ipv4_acceptor::create(port, addr); receive_loop( // libcppa's blocking API on(atom("accept")) >> [&] { if (util::poll(acceptor->file_handle()) && (auto io = acceptor->try_accept_connection())) { auto conn = spawn<Connection>((*io).first, (*io).second); send(handler, atom("connection"), conn); } self << last_dequeued(); }, on(atom("kill")) >> [] { self->quit(); } ); } 10 / 17

  15. A Generic Asynchronous IPv4 Server template <typename Connection> void server(uint16_t port, char const* addr, actor_ptr handler) { auto acceptor = network::ipv4_acceptor::create(port, addr); receive_loop( // libcppa's blocking API on(atom("accept")) >> [&] { if (util::poll(acceptor->file_handle()) && (auto io = acceptor->try_accept_connection())) { auto conn = spawn<Connection>((*io).first, (*io).second); send(handler, atom("connection"), conn); } self << last_dequeued(); }, on(atom("kill")) >> [] { self->quit(); } ); } 10 / 17

  16. A Generic Asynchronous IPv4 Server template <typename Connection> void server(uint16_t port, char const* addr, actor_ptr handler) { auto acceptor = network::ipv4_acceptor::create(port, addr); receive_loop( // libcppa's blocking API on(atom("accept")) >> [&] { if (util::poll(acceptor->file_handle()) && (auto io = acceptor->try_accept_connection())) { auto conn = spawn<Connection>((*io).first, (*io).second); send(handler, atom("connection"), conn); } self << last_dequeued(); }, on(atom("kill")) >> [] { self->quit(); } ); } 10 / 17

  17. A Generic Asynchronous IPv4 Server template <typename Connection> void server(uint16_t port, char const* addr, actor_ptr handler) { auto acceptor = network::ipv4_acceptor::create(port, addr); receive_loop( // libcppa's blocking API Infinite loop that dequeues messages on(atom("accept")) >> [&] { from the actor's inbox if (util::poll(acceptor->file_handle()) && (auto io = acceptor->try_accept_connection())) { auto conn = spawn<Connection>((*io).first, (*io).second); send(handler, atom("connection"), conn); } self << last_dequeued(); }, on(atom("kill")) >> [] { self->quit(); } ); } 10 / 17

  18. A Generic Asynchronous IPv4 Server template <typename Connection> void server(uint16_t port, char const* addr, actor_ptr handler) { auto acceptor = network::ipv4_acceptor::create(port, addr); receive_loop( // libcppa's blocking API on(atom("accept")) >> [&] { if (util::poll(acceptor->file_handle()) && (auto io = acceptor->try_accept_connection())) { auto conn = spawn<Connection>((*io).first, (*io).second); Behavior definition: start the accept send(handler, atom("connection"), conn); loop or shut down the actor } self << last_dequeued(); }, on(atom("kill")) >> [] { self->quit(); } ); } 10 / 17

  19. A Generic Asynchronous IPv4 Server template <typename Connection> Spawns an event_based_actor with a void server(uint16_t port, char const* addr, actor_ptr handler) { auto acceptor = network::ipv4_acceptor::create(port, addr); pair of streams for reading and writing, then receive_loop( // libcppa's blocking API announces the new actor to another actor on(atom("accept")) >> [&] { if (util::poll(acceptor->file_handle()) && (auto io = acceptor->try_accept_connection())) { auto conn = spawn<Connection>((*io).first, (*io).second); send(handler, atom("connection"), conn); } self << last_dequeued(); }, on(atom("kill")) >> [] { self->quit(); } ); } 10 / 17

  20. Outline 1. Example Application: VAST 2. Designing Distributed Applications 3. Thinking libcppa Interfacing with 3rd-party APIs Agility Through Network Transparency Behavior Composition Monadic Composition 10 / 17

  21. Developing Agile Systems Provisioning ◮ Reality: skewed workload distributions 35 → Requires dynamic provisioning 30 ◮ Under -provisioned: spin up actors ◮ Over -provisioned: bring down actors 25 Bytes (MB) 20 Agility 15 ◮ Ability to handle/buffer peak loads 10 ◮ Runtime re-configuration 5 0 100 200 300 400 500 600 → without process restart Time (seconds) → without losing in-memory state 11 / 17

  22. Wiring Components at Runtime class program { public: void run() { auto host = config_.get("tracker.host"); auto port = config_.as<unsigned>("tracker.port"); if (config_.check("tracker-actor")) { tracker_ = spawn<id_tracker>("/path/to/id_file"); publish(tracker_, port, host.data()); } else { tracker_ = remote_actor(host, port); } ... // Further similar initializations. } private: configuration config_; actor_ptr tracker_; }; 12 / 17

  23. Wiring Components at Runtime class program { public: void run() { auto host = config_.get("tracker.host"); auto port = config_.as<unsigned>("tracker.port"); if (config_.check("tracker-actor")) { tracker_ = spawn<id_tracker>("/path/to/id_file"); publish(tracker_, port, host.data()); } else { tracker_ = remote_actor(host, port); } If actor should run in this process, ... // Further similar initializations. } spawn and publish it private: configuration config_; actor_ptr tracker_; }; 12 / 17

  24. Wiring Components at Runtime class program { public: void run() { auto host = config_.get("tracker.host"); auto port = config_.as<unsigned>("tracker.port"); Otherwise connect to it if (config_.check("tracker-actor")) { tracker_ = spawn<id_tracker>("/path/to/id_file"); publish(tracker_, port, host.data()); } else { tracker_ = remote_actor(host, port); } ... // Further similar initializations. } private: configuration config_; actor_ptr tracker_; }; 12 / 17

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend