#actor-model #actix #service #async #async-api #handler #message

serviceless

Rust中的简单actor模型,类似于actix。

3个版本

0.1.2 2023年12月15日
0.1.1 2023年9月12日
0.1.0 2023年9月11日

#465 in 异步

MIT 许可证

11KB
203

Serviceless

Serviceless 是一个简单的 Rust actor 模型,类似于 actix,但更简单且支持异步。

目前,这个crate只使用 tokio 作为后端。

这个crate没有不安全的代码。

使用方法

这个crate提供与 actix 相同的API。但所有API都是异步的,包括处理器。

服务

Service 是 Actor 模型中的 Actor

我们可以在一个 struct 上实现一个 Service 来声明一个 Service

pub struct Service0 {}

impl Service for Service0 {}

Service 提供了名为 startedstopped 的钩子,它们都是异步的。请使用 async_trait 宏。

pub struct Service1 {}

#[async_trait]
impl Service for Service1 {
    async fn started(&mut self, _ctx: &mut Context<Self>) {
        println!("Started")
    }
}

启动服务

启动服务非常简单,只需创建它并调用 start 方法。

let svc = Service1 {};
svc.start();

注意:此函数必须在异步函数中调用或在异步运行时初始化之后调用。否则,它将引发恐慌。

停止和暂停

当服务启动时,我们可以在 context 上调用停止和暂停方法。

您可以在服务钩子或处理器中调用这些函数。

处理器和消息

一个服务可以向其他服务发送消息,或被其他服务调用。

消息

要调用其他服务,我们必须首先声明一个 Message

任何类型都可以是消息,只需在 struct 上实现 Message 特性并定义一个结果。

pub struct Messagep {}

pub struct MessageResult {}

impl Message for Message0 {
    type Result = MessageResult;
}

处理器

在服务上实现处理器,我们可以使服务接受来自其他服务的调用。

#[async_trait]
impl Handler<U8> for Service0 {
    async fn handler(&mut self, message: U8, _ctx: &mut Context<Self>) -> U8 {
        U8(message.0 + 2)
    }
}

处理器也是一个异步函数,请使用 async_trait 宏。

地址

当我们启动一个服务时,我们可以获取一个地址。我们也可以从 Context 中获取它。

调用和发送

地址可以进行调用或发送。

  • 调用意味着调用者想要知道结果。
    1. 这是一个异步函数
    2. 当服务停止时,调用者将从错误中获取 ServiceStopped
    3. 当服务暂停时,调用者将从错误中获取 ServicePaused
  • 发送意味着调用者不关心结果,因此
    1. 这是一个普通函数
    2. 当服务停止时,调用者将从错误中获取 ServiceStopped
    3. 调用者无法知道服务已暂停

依赖关系

~2.3–4MB
~66K SLoC