#actor #tokio #fault-tolerant #async #built #tasks

kameo

基于 Tokio 构建的容错异步 Actor

15 个版本 (8 个破坏性更新)

0.9.0 2024 年 6 月 25 日
0.8.0 2024 年 4 月 19 日
0.3.2 2024 年 3 月 31 日

#103并发

Download history 48/week @ 2024-04-27 22/week @ 2024-05-04 26/week @ 2024-05-11 132/week @ 2024-05-18 67/week @ 2024-05-25 32/week @ 2024-06-01 37/week @ 2024-06-08 73/week @ 2024-06-15 218/week @ 2024-06-22 41/week @ 2024-06-29 80/week @ 2024-07-06 406/week @ 2024-07-13 194/week @ 2024-07-20 37/week @ 2024-07-27 178/week @ 2024-08-03 103/week @ 2024-08-10

每月 662 次下载

MIT/Apache

160KB
3.5K SLoC

卡美奥 🧚🏻

Crates.io Version Crates.io Total Downloads Crates.io License GitHub Repo stars

基于 Tokio 构建的容错异步 Actor

  • 异步:基于 tokio,actors 在它们自己的独立派生任务中异步运行。
  • 监督:通过子/父/兄弟关系链接 actors,创建依赖关系。
  • 有界/无界 MPSC 通道:使用 mpsc 通道在 actors 之间进行消息传递,有界性可配置。
  • 并发查询:在不需要可变状态时支持查询的并发处理。
  • 恐慌安全:内部捕获恐慌,允许 actors 重新启动。

安装

使用 cargo add

cargo add kameo

或手动添加到依赖项中

[dependencies]
kameo = "*"

不使用宏定义 Actor

use kameo::Actor;
use kameo::message::{Context, Message};

// Define the actor state
struct Counter {
    count: i64,
}

impl Actor for Counter {}

// Define messages
struct Inc { amount: u32 }

impl Message<Inc> for Counter {
    type Reply = i64;

    async fn handle(&mut self, msg: Counter, _ctx: Context<'_, Self, Self::Reply>) -> Self::Reply {
        self.count += msg.0 as i64;
        self.count
    }
}

使用宏定义 Actor

use kameo::{messages, Actor};

// Define the actor state
#[derive(Actor)]
struct Counter {
    count: i64,
}

// Define messages
#[messages]
impl Counter {
    #[message]
    fn inc(&mut self, amount: u32) -> i64 {
        self.count += amount as i64;
        self.count
    }
}
查看生成的宏代码
// Derive Actor
impl kameo::actor::Actor for Counter {
    type Mailbox = kameo::actor::UnboundedMailbox<Self>;

    fn name(&self) -> Cow<'_, str> {
        Cow::Borrowed("Counter")
    }
}

// Messages
struct Inc { amount: u32 }

impl kameo::message::Message<Inc> for Counter {
    type Reply = i64;

    async fn handle(&mut self, msg: &mut Inc, _ctx: Context<'_, Self, Self::Reply>) -> Self::Reply {
        self.inc(msg.amount)
    }
}
Actor#[messages]

启动 Actor & 消息传递

let counter_ref = kameo::spawn(Counter { count: 0 });

let count = counter_ref.ask(Inc(42)).send().await?;
println!("Count is {count}");
ActorRef::ask

基准测试

与 Actix 相比,吞吐量提高 13 倍

benchmark

以下显示向 Kameo 和 Actix 中的 actor 发送消息的基本基准测试。请始终自行基准测试。

基准测试结果

向 actor 发送消息

基准测试 时间
卡美奥 未同步消息 432.26 纳秒
卡美奥 同步消息 503.89 纳秒
卡美奥 查询 1.3000 微秒
Actix 消息 5.7545 微秒

在 actor 中处理 Fibonacci 序列,直到 20

基准测试 时间
卡美奥 未同步消息 18.229 微秒
卡美奥 同步消息 18.501 微秒
卡美奥 查询 19.257 微秒
Actix 消息 27.442 微秒

贡献

欢迎贡献!请随意提交拉取请求、创建问题或提出改进建议。

许可证

kameo 在以下任一许可证下双许可

任选其一。

依赖项

~4–5.5MB
~97K SLoC