2 个版本

0.1.2 2019年11月29日
0.1.1 2019年11月29日

#19#extern

每月 23 次下载

MIT 许可证

38KB
609

Izta - Rust 异步任务调度器

Izta 是 Rust 的异步工作队列,它设计用于在大多数 Rust 应用程序中运行,无需更改软件架构或系统基础设施。它可以在应用程序进程内部作为单独的线程运行,也可以在单独的服务器上独立运行。多个实例可以并发运行以并行执行任务。Izta 还实现了命名队列,以便一个队列中的任务可以由 Izta 实例 A 处理,而另一个队列中的任务可以由 Izta 实例 B 处理 - 允许繁忙的队列独立于其他队列进行扩展。目前,Postgres 是唯一支持的数据库后端。

示例

在开始工作队列之前,需要定义工作本身。任何实现了 Job(请参阅 Job 文档以获取更多详细信息)、SerializeDeserialize 特性的结构体都是有效的工作类型。

以下是一个简单地执行两个数相除的工作示例

#[macro_use] extern crate serde;
use izta::job::Job;

// Jobs can be any type that implements the Job, Serialize and Deserialize traits
#[derive(Serialize, Deserialize)]
struct DivideJob {
    a: i64,
    b: i64,
}

// Jobs must have a serializable error type. Could be `()` for jobs that always succeed
#[derive(Serialize, Deserialize)]
enum DivideJobErr {
    DivideByZero,
}

impl Job for DivideJob {
    // Specify the result and error types
    type R = i64;
    type E = DivideJobErr;

    // All jobs must have a UUID
    const UUID: &'static str = "74f3a15b-75c0-4889-9546-63b02ff304e4";

    const MAX_ATTEMPTS: usize = 3;

    // Job logic - return an `Err` for errors and `Ok` if successful.
    fn run(&self) -> Result<Self::R, Self::E> {
        if self.b == 0 {
            return Err(DivideJobErr::DivideByZero);
        }
        Ok(self.a / self.b)
    }
}

定义工作后,我们现在可以创建一个任务运行器

#
#
#
#
#
#
use izta::process_jobs;
use izta::runner::Runner;

let runner = Runner::new(
    process_jobs!(DivideJob),
   "postgres://izta:password@localhost:5432/izta_test",
   "tasks",
   vec![],
);

使用 TaskReq::new 方法定义和添加任务很容易

#
#
#
#
#
#
use izta::task::task_req::TaskReq;

let task_req = TaskReq::new(DivideJob { a: 1, b: 2 });
runner.add_task(&task_req);

启动任务运行器将开始执行任务

#
#
#
#
#
#
#
runner.start();

当然,在启动任务运行器之后添加新任务也是可能的。多次运行 start() 将会启动多个任务运行器实例,这些实例将并行执行任务。

依赖关系

~7MB
~159K SLoC