#actor #built #tokio #fault-tolerant #async #macro #kameo

macro kameo_macros

基于Tokio的过程宏构建的容错异步Actor

11个版本 (6个重大变更)

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

过程宏 中排名 1648

Download history 312/week @ 2024-04-13 60/week @ 2024-04-20 48/week @ 2024-04-27 22/week @ 2024-05-04 26/week @ 2024-05-11 140/week @ 2024-05-18 71/week @ 2024-05-25 36/week @ 2024-06-01 41/week @ 2024-06-08 78/week @ 2024-06-15 221/week @ 2024-06-22 44/week @ 2024-06-29 81/week @ 2024-07-06 409/week @ 2024-07-13 196/week @ 2024-07-20 35/week @ 2024-07-27

每月下载量 723
kameo 中使用

MIT/Apache

35KB
635

Kameo 🧚🏻

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

基于Tokio的容错异步Actor

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

安装

使用 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发送消息

基准测试 时间
Kameo Unsync Message 432.26 ns
Kameo Sync Message 503.89 ns
Kameo Query 1.3000 µs
Actix Message 5.7545 µs

在actor中处理斐波那契序列至20

基准测试 时间
Kameo Unsync Message 18.229 µs
Kameo Sync Message 18.501 µs
Kameo Query 19.257 µs
Actix Message 27.442 µs

贡献

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

许可证

kameo 适用于以下任一许可证

由您选择。

依赖项

~285–730KB
~17K SLoC