1个不稳定版本
0.1.1 | 2021年5月29日 |
---|---|
0.1.0 |
|
#2 in #cache-backend
93KB
1.5K SLoC
hitbox-actix
Hitbox-Actix是Actix演员框架的异步缓存框架。它适用于分布式和单机应用程序。
功能
- 自动缓存键生成。
- 多种缓存后端实现。
- 陈旧缓存机制。
- 缓存锁以防止雪崩效应。
- 分布式缓存锁。
- 开箱即用的详细指标。
后端实现
- Redis
- 内存后端
功能标志
- derive - 支持对Cacheable特质的宏。
- redis - 支持默认Redis后端。
限制
默认缓存键实现基于serde_qs包,并有一些限制。
文档
流程图
示例
依赖项
[dependencies]
hitbox_actix = "0.1"
代码
首先,您应该为您的actix 消息推导Cacheable特质
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;
下一步是声明Upstream演员并实现Ping的actix处理器
#[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))
})
}
}
最后一步是初始化并启动CacheActor和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(())
}
依赖项
~11MB
~183K SLoC