Crates.io | hitbox-actix |
lib.rs | hitbox-actix |
version | 0.1.1 |
source | src |
created_at | 2021-05-29 18:49:58.646147 |
updated_at | 2021-05-29 21:10:44.584363 |
description | Asynchronous caching framework for Actix. |
homepage | |
repository | https://github.com/hit-box/hitbox/ |
max_upload_size | |
id | 403593 |
size | 31,683 |
Hitbox-Actix is an asynchronous caching framework for Actix actor framework. It's designed for distributed and for single-machine applications.
Default cache key implementation based on serde_qs crate and have some restrictions.
[dependencies]
hitbox_actix = "0.1"
First, you should derive Cacheable trait for your actix Message:
use actix::prelude::*;
use actix_derive::{Message, MessageResponse};
use hitbox_actix::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Message, Cacheable, Serialize)]
#[rtype(result = "Result<Pong, Error>")]
struct Ping {
id: i32,
}
#[derive(MessageResponse, Deserialize, Serialize, Debug)]
struct Pong(i32);
#[derive(Debug)]
struct Error;
Next step is declare Upstream actor and implement actix Handler for Ping:
#[derive(Debug)]
struct UpstreamActor;
impl Actor for UpstreamActor {
type Context = Context<Self>;
}
impl Handler<Ping> for UpstreamActor {
type Result = ResponseFuture<<Ping as Message>::Result>;
fn handle(&mut self, msg: Ping, _ctx: &mut Self::Context) -> Self::Result {
println!("Handler::Ping");
Box::pin(async move {
actix_rt::time::sleep(core::time::Duration::from_secs(3)).await;
Ok(Pong(msg.id))
})
}
}
The last step is initialize and start CacheActor and UpstreamActor:
use tracing_subscriber::EnvFilter;
#[actix_rt::main]
async fn main() -> Result<(), CacheError> {
let filter = EnvFilter::new("hitbox=trace");
tracing_subscriber::fmt()
.with_max_level(tracing::Level::TRACE)
.with_env_filter(filter)
.init();
let backend = RedisBackend::new()
.await?
.start();
let cache = Cache::builder()
.with_stale()
.finish(backend)
.start();
let upstream = UpstreamActor.start();
/// And send `Ping` message into cache actor
let msg = Ping { id: 42 };
let res = cache.send(msg.into_cache(&upstream)).await??;
println!("{:#?}", res);
Ok(())
}