Revisión de los últimos cambios en rotor (v0.10 ... v0.14)

sistema actor







rotor es un microformado discreto de actor C ++ con la capacidad de crear jerarquías de supervisores, similar a sus hermanos mayores: caf y sobjectizer . En lanzamientos recientes, desde el último anuncio , se han acumulado mejoras significativas que me gustaría destacar.







Interfaz común para temporizadores (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



.







Por lo tanto, se decidió introducir nuestra propia clase de error extendida rotor::extended_error_t



, que contiene std::error_code



, std::string



como contexto (generalmente la identidad del actor), así como un puntero inteligente al siguiente error extendido que causó el actual. Ahora, el colapso de la jerarquía de actores se puede representar mediante una cadena de errores extendidos, donde se puede rastrear el motivo del cierre de cada actor:







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();
    }
}
      
      





generará algo como:







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





Junto con la identificación del actor, esta función proporciona más herramientas de diagnóstico para los desarrolladores que utilizan rotor .








All Articles