overclock

Crates.iooverclock
lib.rsoverclock
version0.1.13
sourcesrc
created_at2020-08-12 01:21:54.21399
updated_at2023-05-04 19:55:58.436371
descriptionA framework for building data-driven distributed systems
homepagehttps://www.overclock.rs
repositoryhttps://github.com/louaykamel/overclock
max_upload_size
id275638
size370,676
Louay Kamel (louaykamel)

documentation

README

Actor framework for building data driven distributed systems

Apache 2.0 license


About

Overclock is an actor model framework inspired by Elixir, enforces supervision tree and interoperability.

Features

  • Async
  • Based on Tokio
  • Multiple channel types
  • Actor local store, accessible through directory path interface
  • Websocket server for RPC communication
  • Built-in config support
  • Dynamic Topology
  • Reusable actors
  • Promethues supports
  • Communication

Usage

Add overclock to your Cargo.toml:

[dependencies]
overclock = "0.1"

Implement Actor trait


use overclock::core::*;

// Define your actor struct
#[derive(Debug, Serialize, Deserialize, PartialEq, Default)]
struct HelloWorld;

#[async_trait::async_trait]
impl<S> Actor<S> for HelloWorld
where
    S: SupHandle<Self>,
{
    // Temporary state or resources during the actor lifecycle
    type Data = usize;
    // Interval channel which will yield Instant every 1000ms;
    type Channel = IntervalChannel<1000>;
    async fn init(&mut self, rt: &mut Rt<Self, S>) -> ActorResult<Self::Data> {
        log::info!("HelloWorld: {}", rt.service().status());
        let counter = 0;
        Ok(counter)
    }
    async fn run(&mut self, rt: &mut Rt<Self, S>, mut counter: Self::Data) -> ActorResult<()> {
        log::info!("HelloWorld: {}", rt.service().status());
        while let Some(event) = rt.inbox_mut().next().await {
            if counter == 3 {
                counter += 1;
                log::info!("HelloWorld: Received instant {:?}, counter: {}", event, counter);
            } else {
                break
            }
        }
        log::info!("HelloWorld: exited its event loop");
        Ok(())
    }
}


#[tokio::main]
async fn main() {
    let runtime = Runtime::from_config::<HelloWorld>().await.expect("Runtime to run");
    runtime.block_on().await.expect("Runtime to shutdown gracefully");
}

Run the above illustrated example

cargo run --features="ron_config"

Contributing

All contributions are welcome!

LICENSE

This project is licensed under either of

COPYRIGHT

Copyright (C) 2022 Louay Kamel
Copyright (C) 2021 IOTA Stiftung
Commit count: 24

cargo fmt