1个不稳定版本

0.1.1 2021年5月29日
0.1.0 2021年5月29日

#2 in #cache-backend

MIT许可证

93KB
1.5K SLoC

hitbox-actix

Build status Coverage Status

Hitbox-Actix是Actix演员框架的异步缓存框架。它适用于分布式和单机应用程序。

功能

  • 自动缓存键生成。
  • 多种缓存后端实现。
  • 陈旧缓存机制。
  • 缓存锁以防止雪崩效应
  • 分布式缓存锁。
  • 开箱即用的详细指标。

后端实现

功能标志

  • derive - 支持对Cacheable特质的宏。
  • redis - 支持默认Redis后端。

限制

默认缓存键实现基于serde_qs包,并有一些限制

文档

流程图

Simple flow

示例

依赖项

[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