15 releases

0.1.13 May 4, 2023
0.1.12 Dec 2, 2022
0.1.10 Nov 15, 2022
0.1.9 Jul 3, 2022
0.0.0 Aug 12, 2020

#233 in Asynchronous

Download history 50/week @ 2024-02-18 25/week @ 2024-02-25 7/week @ 2024-03-10 188/week @ 2024-03-31

226 downloads per month
Used in scylladb

Custom license

260KB
6K SLoC

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 (C) 2022 Louay Kamel
Copyright (C) 2021 IOTA Stiftung

Dependencies

~8–48MB
~744K SLoC