Actor framework for building data driven distributed systems
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:
toml
[dependencies]
overclock = "0.1"
Implement Actor trait
```rust
use overclock::core::*;
// Define your actor struct
[derive(Debug, Serialize, Deserialize, PartialEq, Default)]
struct HelloWorld;
[asynctrait::asynctrait]
impl Actor for HelloWorld
where
S: SupHandle,
{
// 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) -> ActorResult {
log::info!("HelloWorld: {}", rt.service().status());
let counter = 0;
Ok(counter)
}
async fn run(&mut self, rt: &mut Rt, 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::fromconfig::().await.expect("Runtime to run");
runtime.blockon().await.expect("Runtime to shutdown gracefully");
}
```
Run the above illustrated example
shel
cargo run --features="ron_config"
Contributing
All contributions are welcome!
LICENSE
This project is licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
COPYRIGHT
Copyright (C) 2022 Louay Kamel
Copyright (C) 2021 IOTA Stiftung