Rückblick auf die neuesten Änderungen am Rotor (v0.10 ... v0.14)

Akteursystem







Rotor ist ein unauffälliges C ++ - Schauspieler-Mikroformwerk mit der Fähigkeit, Supervisor-Hierarchien zu erstellen, ähnlich wie bei seinen älteren Brüdern - Café und Sobjectizer . In den letzten Veröffentlichungen haben sich seit der letzten Ankündigung erhebliche Verbesserungen angesammelt, die ich hervorheben möchte.







Gemeinsame Schnittstelle für Timer (v0.10)



, . . . v0.10



API , ; (event loop) API, . : API , API rotor', . , , .







v0.10



rotor', - :







namespace r = rotor;

struct some_actor_t: r::actor_base_t {
    void on_start() noexcept {
        timer_request = start_timer(timeout, *this, &some_actor_t::on_timer);
    }

    void on_timer(r::request_id_t, bool cancelled) noexcept {
        ...;
    }

    void some_method() noexcept {
        ...
        cancel_timer(timer_id);
    }

    r::request_id_t timer_id;
};
      
      





, (shutdown_finish), , (undefined behavior).







(v0.10)



- , caf "-", sobjectizer' "--" ("fire-and-forget") . rotor , - "--", "-" .







, caf sobjectizer, , , , . , rotor' , , . "-" , "" , - (I/O), . , HTTP-, , . : , , , .







, , .. - , , - .







rotor', , , , - , , , , -, , , "". , - , . . .







namespace r = rotor;

namespace payload {
struct pong_t {};
struct ping_t {
    using response_t = pong_t;
};
} // namespace payload

namespace message {
using ping_request_t = r::request_traits_t<payload::ping_t>::request::message_t;
using ping_response_t = r::request_traits_t<payload::ping_t>::response::message_t;
using ping_cancel_t = r::request_traits_t<payload::ping_t>::cancel::message_t;
} // namespace message

struct some_actor_t: r::actor_base_t {
    using ping_ptr_t = r::intrusive_ptr_t<message::ping_request_t>;

    void on_ping(ping_request_t& req) noexcept {
        // just store request for further processing
        ping_req.reset(&req);
    }

    void on_cancel(ping_cancel_t&) noexcept {
        if (req) {
            // make_error is v0.14 feature
            make_response(*req, make_error(r::make_error_code(r::error_code_t::cancelled)));
            req.reset();
        }
    }

    //  ""   .
    ping_ptr_t ping_req;
};
      
      





, sobjectizer', , , -, "-", , -, , sobjectizer', . . . , - , "-" sobjectizer', , , , , .







std::thread backend/supervisor (v0.12)



, rotor sobjectizer: , . , .







, . , , . , ; , , , . , , , .. , , sha512 1TB, , . .







, std::thread



, . , , , rotor' , "" (), . , ..:







struct sha_actor_t : public r::actor_base_t {
    ...
    void configure(r::plugin::plugin_base_t &plugin) noexcept override {
        r::actor_base_t::configure(plugin);
        plugin.with_casted<r::plugin::starter_plugin_t>([&](auto &p) {
            p.subscribe_actor(&sha_actor_t::on_process)->tag_io(); // 
        });
    }
      
      





, sha512



, CTRL+c



, .







(v0.14)



— ( rotor' , sobjectizer' mbox



'). , , , :







struct my_supervisor_t : public r::supervisor_t {
    void on_child_shutdown(actor_base_t *actor) noexcept override {
        std::cout << "actor " << (void*) actor->get_address().get() << " died \n";
    }
}
      
      





, . , , , , on_start()



. , , std::string identity



actor_base_t



. , address_maker_plugin_t



:







struct some_actor_t : public t::actor_baset_t {
    void configure(r::plugin::plugin_base_t &plugin) noexcept override {
        plugin.with_casted<r::plugin::address_maker_plugin_t>([&](auto &p) {
            p.set_identity("my-actor-name", false);
        });
        ...
    }
};
      
      





:







struct my_supervisor_t : public r::supervisor_t {
    void on_child_shutdown(actor_base_t *actor) noexcept override {
        std::cout << actor->get_identity() << " died \n";
    }
}
      
      





, . , . bool



set_identity(name, append_addr)



.







- actor 0x7fd918016d70



supervisor 0x7fd218016d70



. rotor' v0.14



.







Extended Error std::error_code, shutdown reason (v0.14)



- , v0.14



, std::error_code



. , , , rotor', . : , . , . . . , , , , , . , std::error_code



.







Daher wurde beschlossen , unsere eigene erweiterte Fehlerklasse einzuführen rotor::extended_error_t



, die enthalten std::error_code



, std::string



als Kontext ( in der Regel der Identität des Schauspielers), sowie ein Smart - Pointer auf die nächsten erweiterten Fehler, der die aktuellen verursacht. Jetzt kann der Zusammenbruch der Akteurshierarchie durch eine Kette erweiterter Fehler dargestellt werden, wobei der Grund für das Herunterfahren jedes Akteurs verfolgt werden kann:







struct my_supervisor_t : public r::supervisor_t {
    void on_child_shutdown(actor_base_t *actor) noexcept override {
        std::cout << actor->get_identity() << " died, reason :: " << actor->get_shutdown_reason()->message();
    }
}
      
      





gibt so etwas aus wie:







actor-2 due to supervisor shutdown has been requested by supervisor <- actor-1 due initialization failed
      
      





Zusammen mit der Identifizierung des Akteurs bietet diese Funktion Entwicklern, die Rotoren verwenden, weitere Diagnosetools .








All Articles